繁体   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