簡體   English   中英

這個左連接中的案例表達式?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM