如何用单条PostgreSQL SQL语句实现特定条件查询逻辑?
单条SQL实现需求的方案
完全可行,这里提供两种简洁高效的实现方式:
方式一:基于优先级排序的UNION ALL写法
这种方式通过给不同查询结果标记优先级,确保优先返回a=100的行,不存在时再返回符合条件的最小b行:
SELECT * FROM ( -- 优先查询a=100的行,标记优先级为1 SELECT *, 1 AS priority FROM A WHERE a = 100 UNION ALL -- 查询b<10000的行,标记优先级为2 SELECT *, 2 AS priority FROM A WHERE b < 10000 ) temp_result -- 先按优先级排序,再按b排序,取第一行 ORDER BY priority, b LIMIT 1
说明
- 因为
a带有唯一索引,第一个子查询最多返回一行,不会出现多个优先级1的结果 - 外层排序时优先取优先级1的行,若不存在则取优先级2中
b最小的行,完全符合需求
方式二:带存在判断的UNION ALL写法
通过NOT EXISTS控制第二个查询仅在a=100的行不存在时执行:
-- 先查询a=100的行 SELECT * FROM A WHERE a = 100 UNION ALL -- 仅当a=100的行不存在时,查询b<10000且b最小的行 SELECT * FROM A WHERE b < 10000 AND NOT EXISTS (SELECT 1 FROM A WHERE a = 100) ORDER BY b LIMIT 1
说明
- 若第一个查询有结果,第二个查询因
NOT EXISTS条件不成立,不会返回数据,最终结果就是a=100的行 - 若第一个查询无结果,第二个查询正常执行,返回
b<10000中最小的那一行
两种写法都能高效利用表上的唯一索引,性能表现优异。
内容的提问来源于stack exchange,提问作者TieDad
相关产品推荐
相关产品推荐

