如何在CTE无匹配记录时返回NULL结果?
解决方案
当然可以实现,这里提供两种常用的解决方法:
方法1:修改CTE a 确保始终返回一行
调整CTE a 的查询逻辑,让它在没有匹配记录时返回NULL值,保证a始终有一行数据:
with a as ( select ISNULL((select top 1 flow_id from flow where invoice_id > 0), NULL) as flow_id ), b as ( select '45' as col2 ) select * from a, b
原理:子查询(select top 1 flow_id from flow where invoice_id > 0)在无匹配时返回NULL,外层的ISNULL确保CTE a不会为空,交叉连接后自然会保留col2=45的结果。如果是PostgreSQL等不支持TOP的数据库,把top 1替换为limit 1即可。
方法2:用右连接(RIGHT JOIN)替代交叉连接
因为CTE b 始终包含一行数据,通过RIGHT JOIN以b作为主表,即使a为空也会保留b的行,对应flow_id自动填充为NULL:
with a as ( select top 1 flow_id from flow where invoice_id > 0 ), b as ( select '45' as col2 ) select a.flow_id, b.col2 from a right join b on 1=1
原理:RIGHT JOIN会强制保留右表(b)的所有行,左表(a)无匹配数据时,对应字段显示NULL,on 1=1的条件模拟了原交叉连接的逻辑。
内容的提问来源于stack exchange,提问作者teenup
相关产品推荐
相关产品推荐

