[英]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.