如何让SQL查询无论是否匹配数据都始终返回至少1条记录
核心问题说明
你之前的UNION方案失效的核心原因:两个查询子句都从table_a取数,一旦table_a为空,两个子句都会返回空,UNION后自然还是空结果。
可行方案
方案1:UNION ALL + 存在性判断(兼容性最强、逻辑直观)
-- 原有业务查询逻辑 SELECT column_a, CASE WHEN column_a > 10 THEN 0 ELSE 1 END AS column_b FROM table_a UNION ALL -- 仅当table_a无数据时返回默认行 SELECT -1 AS column_a, -1 AS column_b WHERE NOT EXISTS (SELECT 1 FROM table_a);
该写法的效果:table_a有数据时会正常返回所有业务查询结果,无数据时会返回你预设的(-1,-1)默认行,完全符合需求。
方案2:右连接固定单行表(适合复杂默认值场景)
SELECT COALESCE(t.column_a, d.default_a) AS column_a, COALESCE(t.column_b, d.default_b) AS column_b FROM ( -- 原有业务查询逻辑 SELECT column_a, CASE WHEN column_a > 10 THEN 0 ELSE 1 END AS column_b FROM table_a ) t RIGHT JOIN ( -- 自定义默认值,固定返回1行 SELECT -1 AS default_a, -1 AS default_b ) d ON 1=1;
该写法的效果:右连接的右侧是固定1行的默认值表,不管左侧业务查询有没有结果,都会保留右侧的行,最终结果要么是业务查询的所有行,要么是1行默认值。
内容的提问来源于stack exchange,提问作者user971741
相关产品推荐
相关产品推荐

