SQL Server查询无匹配记录时如何返回全为NULL的结果行
解决方案
场景1:需要保留原查询所有匹配行,仅无结果时补全NULL行
该方案为通用写法,适配绝大多数主流数据库(PostgreSQL、MySQL 8.0+、SQL Server、Oracle等):
WITH query_result AS ( -- 这里替换为你原本的查询语句 SELECT branch, acno, custno FROM ac_master WHERE branch = 9 ) SELECT * FROM query_result UNION ALL -- 无匹配结果时追加全NULL行 SELECT NULL AS branch, NULL AS acno, NULL AS custno WHERE NOT EXISTS (SELECT 1 FROM query_result)
如果使用不支持CTE的旧版本数据库(如MySQL 5.x),可以用重复子查询的写法:
SELECT branch, acno, custno FROM ac_master WHERE branch = 9 UNION ALL SELECT NULL, NULL, NULL WHERE NOT EXISTS ( SELECT 1 FROM ac_master WHERE branch = 9 )
注意事项
- 两个SELECT查询返回的列数、列数据类型必须完全匹配,如遇到类型不兼容报错,可对NULL做显式类型转换,例如
CAST(NULL AS UNSIGNED) AS branch - 原查询匹配到多少行就会返回多少行,仅当完全无匹配结果时才会追加1行全NULL记录
场景2:仅需要返回最多1行结果
如果你的查询逻辑本身只需要返回最多1行(比如branch=9对应的记录唯一),可以用更简单的聚合函数写法:
SELECT MAX(branch) AS branch, MAX(acno) AS acno, MAX(custno) AS custno FROM ac_master WHERE branch = 9
聚合查询在无匹配行时默认返回1行全NULL的结果,无需额外判断。缺点是如果原查询匹配到多行,只会返回1行聚合后的结果,无法保留所有匹配行。
内容的提问来源于stack exchange,提问作者hemu_k
相关产品推荐
相关产品推荐

