PostgreSQL 14:如何将两个查询合并为一个?当第一个查询无结果时执行第二个查询
实现条件优先的合并查询(PostgreSQL 14)
当然可以实现你想要的逻辑!这里有两种实用的方法来完成这个需求,在PostgreSQL 14中都能完美运行:
方法一:使用UNION ALL + NOT EXISTS(逻辑直观)
这种方法的思路是先尝试获取guid匹配的结果,只有当这个查询没有返回数据时,才执行default='true'的查询:
SELECT * FROM T WHERE T.guid = 'someguid' UNION ALL SELECT * FROM T WHERE T.default = 'true' AND NOT EXISTS (SELECT 1 FROM T WHERE T.guid = 'someguid');
UNION ALL用来合并两个查询的结果集(比UNION更高效,因为不会做额外的去重操作)- 第二个查询里的
NOT EXISTS条件确保:只有当第一个查询没有找到任何匹配行时,第二个查询才会被执行并返回结果
方法二:使用排序 + FETCH FIRST ... WITH TIES(性能更优)
如果你的表数据量较大,这种方法只需要扫描一次表,性能会更好。核心是给guid匹配的行赋予更高优先级,然后只返回最高优先级的所有行:
SELECT * FROM T WHERE T.guid = 'someguid' OR T.default = 'true' ORDER BY CASE WHEN T.guid = 'someguid' THEN 1 ELSE 2 END FETCH FIRST 1 ROWS WITH TIES;
ORDER BY子句给匹配guid的行标记为优先级1,default='true'的行标记为2,确保前者排在前面FETCH FIRST 1 ROWS WITH TIES会返回所有优先级最高的行:如果有guid匹配的行,就只返回这些;如果没有,就返回所有default='true'的行
两种方法都能满足你的需求,你可以根据自己的表结构和数据量选择:如果追求逻辑清晰选第一种,追求性能选第二种。
内容的提问来源于stack exchange,提问作者Alonzzo2




