如何让SQL查询在无匹配数据时返回null,null结果?
解决SQL无匹配结果时返回NULL,NULL的问题
问题场景
现有SQL查询:
select number2, number3 from table3 where acc_num3 = 1234 union select number2, null as number3 from table2 where acc_num2 = 1234
当账号1234存在于任一表时,查询能正常返回结果;但账号在两张表中都不存在时,仅显示列名无数据,需要改为返回null,null。
解决方案
通用方案(支持多数SQL数据库:MySQL 8+、PostgreSQL、SQL Server等)
使用CTE(公共表表达式)封装原查询,再通过UNION ALL追加默认行,仅当原查询无结果时返回该行:
WITH original_query AS ( SELECT number2, number3 FROM table3 WHERE acc_num3 = 1234 UNION SELECT number2, NULL AS number3 FROM table2 WHERE acc_num2 = 1234 ) SELECT * FROM original_query UNION ALL SELECT NULL, NULL WHERE NOT EXISTS (SELECT 1 FROM original_query);
兼容低版本数据库(如MySQL 5.x,不支持CTE)
直接重复子查询逻辑,实现同样效果:
SELECT number2, number3 FROM table3 WHERE acc_num3 = 1234 UNION SELECT number2, NULL AS number3 FROM table2 WHERE acc_num2 = 1234 UNION ALL SELECT NULL, NULL WHERE NOT EXISTS ( SELECT 1 FROM table3 WHERE acc_num3 = 1234 UNION SELECT 1 FROM table2 WHERE acc_num2 = 1234 );
逻辑说明
- 原查询部分保持不变,负责返回账号存在时的匹配结果。
- 最后一行
SELECT NULL, NULL WHERE NOT EXISTS (...)会检查原查询是否有结果:- 若原查询无匹配行,
NOT EXISTS条件成立,返回null,null; - 若原查询有结果,
NOT EXISTS条件不成立,不会追加该行,仅返回原查询结果。
- 若原查询无匹配行,
内容的提问来源于stack exchange,提问作者Ashith John
相关产品推荐
相关产品推荐

