如何实现SQL条件筛选:优先取ic_product=competitor,全NULL则返回全部
解决SQL条件筛选的逻辑问题
问题分析
你的需求是两种互斥的筛选逻辑:
- 当表中存在
ic_product = competitor的记录时,仅返回这类匹配记录 - 当表中
competitor字段全部为NULL时,返回所有记录
你原来的SQL存在两个核心问题:
- 两个CASE表达式之间未添加逻辑连接符(AND/OR),语法本身不合法
- 逻辑上试图同时满足“匹配记录”和“competitor为NULL”,这两个条件互斥,永远不会返回有效结果
正确的SQL写法
方法一:使用EXISTS子查询判断全局状态
SELECT * FROM product WHERE -- 存在匹配记录时,仅返回匹配行 (EXISTS (SELECT 1 FROM product WHERE competitor IS NOT NULL AND competitor = ic_product) AND competitor IS NOT NULL AND competitor = ic_product) -- 所有competitor都是NULL时,返回全部行 OR NOT EXISTS (SELECT 1 FROM product WHERE competitor IS NOT NULL)
方法二:通过统计全局状态实现
先统计表中匹配记录数和非NULL的competitor数量,再根据统计结果筛选:
SELECT p.* FROM product p CROSS JOIN ( SELECT COUNT(CASE WHEN competitor IS NOT NULL AND competitor = ic_product THEN 1 END) AS match_count, COUNT(competitor) AS non_null_competitor_count FROM product ) stats WHERE (stats.match_count > 0 AND p.competitor IS NOT NULL AND p.competitor = p.ic_product) OR stats.non_null_competitor_count = 0
逻辑说明
两种方法都先判断全局状态:
- 当存在
ic_product = competitor的记录时,仅筛选出符合该匹配条件的行 - 当表中所有
competitor字段都是NULL时,直接返回全部数据,无需额外筛选
内容的提问来源于stack exchange,提问作者harsh
相关产品推荐
相关产品推荐

