PostgreSQL查询无匹配行时如何返回值为null的单行结果
实现无匹配时返回单行NULL的SQL修改方案
方法1:通用UNION ALL方案(全数据库兼容,完全匹配原查询逻辑)
这是适用范围最广的方案,完全保留原查询的返回逻辑:
SELECT customer_id FROM ( -- 原有查询逻辑 SELECT c.customer_id FROM `order` o JOIN customer c USING (customer_id) WHERE c.time >= '2021-01-01 10:00:00' AND c.time < '2021-01-01 11:00:00' AND (0 IN (22) OR o.product_id IN (22)) LIMIT 1 -- 拼接兜底的NULL行 UNION ALL SELECT NULL AS customer_id ) AS temp_result LIMIT 1;
逻辑说明:原查询最多返回1行匹配结果,UNION ALL拼接的第二部分固定返回1行值为NULL的结果,外层查询取前1行,有匹配时优先返回原查询的结果,无匹配时自动返回兜底的NULL行。
方法2:聚合函数简化方案(代码更精简)
如果接受无匹配时返回聚合结果的逻辑,可以直接用聚合函数实现:
SELECT MAX(c.customer_id) AS customer_id FROM `order` o JOIN customer c USING (customer_id) WHERE c.time >= '2021-01-01 10:00:00' AND c.time < '2021-01-01 11:00:00' AND (0 IN (22) OR o.product_id IN (22)) LIMIT 1;
逻辑说明:聚合函数在没有匹配行时默认返回NULL,刚好符合需求。注意该方案返回的是匹配项中最大的customer_id,和原LIMIT 1返回任意匹配项的逻辑有差异,对返回值有严格要求时优先选方法1。
注意事项
- 原SQL中的表名
order属于SQL标准保留关键字,实际使用时需要用对应数据库的转义符包裹:MySQL用反引号`,SQL Server用方括号[],PostgreSQL用双引号",避免触发语法错误。 - 方法1兼容性最高,支持所有主流SQL数据库,且和原查询的返回结果完全一致。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

