如何让指定T-SQL聚合查询无返回行时输出预设结果?
嘿,这个需求我之前做数据报表的时候经常碰到,用T-SQL可以很优雅地实现,给你分享两种最实用的方案:
方案1:UNION ALL + NOT EXISTS 精准控制返回逻辑
这种方法逻辑非常直观,先执行你的原聚合查询,如果有匹配结果就直接返回;如果原查询没有命中任何行,就返回我们预设的默认值行。
-- 原聚合查询:有匹配行时返回结果 SELECT NAME, DATE, COUNT(*) AS ROW_COUNT FROM STG WHERE DATE = '2018-04-23' AND NAME = 'DRAFT' GROUP BY NAME, DATE -- 无匹配行时返回默认值 UNION ALL SELECT 'TEST' AS NAME, CAST(GETDATE() AS DATE) AS DATE, -- 转换为DATE类型和原字段对齐 0 AS ROW_COUNT WHERE NOT EXISTS ( -- 检查原查询的过滤条件是否有匹配行 SELECT 1 FROM STG WHERE DATE = '2018-04-23' AND NAME = 'DRAFT' )
为什么好用?
- 逻辑清晰,容易维护,哪怕后续修改过滤条件,只需要同步修改
NOT EXISTS里的子查询即可 - 不会改变原聚合查询的结果结构,完全符合需求
方案2:聚合函数 + COALESCE 极简写法
这种方法利用了T-SQL聚合函数的特性:即使没有匹配行,聚合函数也会返回一行NULL值,我们可以用COALESCE把NULL替换成预设的默认值,代码更简洁:
SELECT COALESCE(MAX(NAME), 'TEST') AS NAME, COALESCE(MAX(DATE), CAST(GETDATE() AS DATE)) AS DATE, COALESCE(COUNT(*), 0) AS ROW_COUNT FROM STG WHERE DATE = '2018-04-23' AND NAME = 'DRAFT'
原理说明:
- 如果有匹配行:
MAX(NAME)就是'DRAFT',MAX(DATE)就是'2018-04-23',COUNT(*)是实际的行数,和原查询结果完全一致 - 如果没有匹配行:所有聚合函数返回NULL,
COALESCE会自动替换成'TEST'、当前日期和0,完美满足默认输出要求
注意事项:
- 如果你的
DATE字段是带时间戳的类型,去掉CAST(GETDATE() AS DATE),直接用GETDATE()即可 - 这个方案适合原查询最多返回1行的场景(比如你的GROUP BY组合是唯一的),如果原查询可能返回多行,方案1更合适
内容的提问来源于stack exchange,提问作者NMB
相关产品推荐
相关产品推荐

