PostgreSQL中UNION查询单条子查询无结果时如何获取有效结果?
嘿,这个需求其实你的原始SQL已经能搞定啦!不过我还是给你理清楚逻辑,再补充几个更灵活的方案,方便你根据不同场景选用:
方案1:直接用你的原始UNION语句
你的示例查询:
(SELECT column1, column2 FROM table1 where column1 = 1) UNION (SELECT column1, column2 FROM table2 WHERE column1 = 100);
当其中任意一个子查询没有匹配行时,UNION会自动忽略空结果集,只返回有数据的那个子查询的结果。不过要注意:UNION会自动对两个结果集的重复行去重,如果你的业务场景不需要去重,换成UNION ALL会有更好的性能:
(SELECT column1, column2 FROM table1 where column1 = 1) UNION ALL (SELECT column1, column2 FROM table2 WHERE column1 = 100);
方案2:显式优先返回某一个表的结果
如果你的需求是优先返回table1的结果,只有当table1没有匹配行时才返回table2的(或者反过来),可以用EXISTS做显式判断,避免同时返回两个结果集:
-- 优先返回table1,空了才查table2 SELECT column1, column2 FROM table1 where column1 = 1 UNION ALL SELECT column1, column2 FROM table2 WHERE column1 = 100 AND NOT EXISTS (SELECT 1 FROM table1 where column1 = 1);
反过来的写法也很简单,调整下顺序和判断条件就行。
方案3:用CTE简化复杂逻辑
如果你的子查询逻辑比较复杂,或者需要多次复用结果集,可以用公共表表达式(CTE)先把两个结果集存起来,再过滤空集:
WITH table1_results AS (SELECT column1, column2 FROM table1 where column1 = 1), table2_results AS (SELECT column1, column2 FROM table2 WHERE column1 = 100) SELECT * FROM table1_results UNION ALL SELECT * FROM table2_results WHERE NOT EXISTS (SELECT 1 FROM table1_results);
内容的提问来源于stack exchange,提问作者Arunraj
相关产品推荐
相关产品推荐

