[英]case expression inside this left join?
所以我有这个 left join
LEFT JOIN LATERAL (SELECT d.country FROM db.patient_info d
WHERE d.id IN (SELECT DISTINCT st.category FROM db.surgery_types st, db.surgery_record sr
WHERE sr.id = st.surgery_record_id AND sr.surgery_type_id = m.id)
ORDER BY d.priority, d.country
LIMIT 1
) c ON TRUE
问题是有时 d.country 会返回 null。如何在左连接中添加 case 语句,以便当 d.country IS NULL 然后是“美国”时?
我的结果是这样的
患者姓名 | 手术类型 |
---|---|
戴夫 | 美国 |
理查德 | 欧盟 |
本 | 欧盟 |
莎莉 | J.P |
鲍勃 | null |
迪基 | null |
我想修改左连接,使其看起来更像这样
患者姓名 | 手术类型 |
---|---|
戴夫 | 美国 |
理查德 | 欧盟 |
本 | 欧盟 |
莎莉 | J.P |
鲍勃 | 美国 |
迪奇 | 美国 |
想法?
使用coalesce
返回第一个非空值。
-- I have no idea if this lateral join is valid.
LEFT JOIN LATERAL (
SELECT coalesce(d.country, 'USA')
FROM db.patient_info d
WHERE d.id IN (
SELECT DISTINCT st.category
FROM db.surgery_types st, db.surgery_record sr
WHERE sr.id = st.surgery_record_id AND sr.surgery_type_id = m.id
)
ORDER BY d.priority, d.country
LIMIT 1
) c ON TRUE
虽然 order by 仍将使用 null,因此它可能无法正确排序。 您可能希望将其拆分为 CTE。
-- Again, no idea if the lateral join is valid,
-- just showing a technique.
with countries as(
SELECT coalesce(d.country, 'USA') as country
FROM db.patient_info d
WHERE d.id IN (
SELECT DISTINCT st.category
FROM db.surgery_types st
JOIN db.surgery_record sr ON sr.id = st.surgery_record_id
-- Don't know what m is
WHERE sr.surgery_type_id = m.id
)
)
with first_country as (
select country
from countries
order by priority, country
limit 1
)
select
...
LEFT JOIN LATERAL countries on true
最后,更新表格以将所有 null 国家设置为USA
,然后使该列not null
可能会更简单、更快速。
不查看您的业务逻辑以及是否需要横向连接或 select 表达式列表中的标量子查询就足够了,这是我的建议。
CROSS JOIN LATERAL
(
select coalesce
(
( /* your lateral subquery in the brackets here */),
'USA'
) as country
) as c
您不再需要左连接。 请注意,这仅在子查询是标量时才有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.