SQL中如何拆分WHERE子句重叠结果,重复匹配时也返回对应条目?
解决方案
你原写法使用WHERE ... OR ...的逻辑是行级过滤,每条数据只要满足任意一个匹配条件就仅会返回一次,且CASE WHEN分支会优先匹配第一个符合的条件,因此重复的检索条件不会生效,也无法返回重复条目。
最优实现方案
使用UNION ALL拼接每个独立的检索条件即可实现需求,UNION ALL不会对多个子查询的结果做去重处理,返回结果的顺序完全和你写的子查询顺序一致,且仅需要发起一次数据库请求,性能远高于循环单次查询。
基础示例(匹配你的需求场景)
SELECT * FROM `table` WHERE NAME LIKE '%Alice%' UNION ALL SELECT * FROM `table` WHERE NAME LIKE '%Bob%' UNION ALL SELECT * FROM `table` WHERE NAME LIKE '%Alice%' UNION ALL SELECT * FROM `table` WHERE NAME LIKE '%Charlie%'
以上查询会直接按照Alice匹配结果 → Bob匹配结果 → Alice匹配结果 → Charlie匹配结果的顺序返回,重复条件对应的结果会完整重复展示,不会合并。
增强示例(方便后续Pandas处理)
如果需要标记每条结果对应的检索条件顺序,可以额外增加自定义字段,后续拿到DataFrame后可以直接基于该字段做分类处理:
-- 增加condition_order字段标记对应第几个检索条件 SELECT *, 1 AS condition_order FROM `table` WHERE NAME LIKE '%Alice%' UNION ALL SELECT *, 2 AS condition_order FROM `table` WHERE NAME LIKE '%Bob%' UNION ALL SELECT *, 3 AS condition_order FROM `table` WHERE NAME LIKE '%Alice%' UNION ALL SELECT *, 4 AS condition_order FROM `table` WHERE NAME LIKE '%Charlie%' -- 可选显式排序,确保结果顺序完全符合预期 ORDER BY condition_order
性能说明
MySQL默认支持的UNION ALL子查询数量上限完全可以覆盖上百个检索条件的场景,单次查询返回所有结果的性能比循环发起100次查询高至少一个数量级,完全适配你用pandas.read_sql()读取结果的需求。
内容的提问来源于stack exchange,提问作者user17193038
相关产品推荐
相关产品推荐

