SQL实现:当多行数据满足指定CODE组合时返回单一值
解决ID对应多CODE时返回单一匹配值的问题
嘿,我完全懂你的困扰——原SQL是逐行做CASE判断,所以当ID=1同时有CODE='2'和'3'时,会返回多行结果(比如对应CODE=2的'200',以及其他不匹配CODE的NULL),但你需要的是基于该ID是否同时拥有一组指定CODE来返回唯一的结果。
下面给你两种靠谱的解决方案:
方案1:用聚合函数统计CODE存在情况
通过SUM(CASE...)统计每个目标CODE在该ID下的出现次数,判断是否所有需要的CODE都存在,再结合GROUP BY ID确保只返回一行:
SELECT CASE -- 检查ID=1是否同时有CODE='1'和'2' WHEN SUM(CASE WHEN CODE = '1' THEN 1 ELSE 0 END) >= 1 AND SUM(CASE WHEN CODE = '2' THEN 1 ELSE 0 END) >= 1 THEN '100' -- 检查ID=1是否同时有CODE='2'和'3' WHEN SUM(CASE WHEN CODE = '2' THEN 1 ELSE 0 END) >= 1 AND SUM(CASE WHEN CODE = '3' THEN 1 ELSE 0 END) >= 1 THEN '200' -- 检查ID=1是否同时有CODE='5'和'7' WHEN SUM(CASE WHEN CODE = '5' THEN 1 ELSE 0 END) >= 1 AND SUM(CASE WHEN CODE = '7' THEN 1 ELSE 0 END) >= 1 THEN '300' END AS ASDASD FROM TABLE WHERE ID = 1 GROUP BY ID;
方案2:用EXISTS子查询验证CODE存在性
这种方式逻辑更直观,直接通过子查询检查每个CODE是否存在于当前ID下,不需要分组:
SELECT CASE WHEN EXISTS (SELECT 1 FROM TABLE WHERE ID=1 AND CODE='1') AND EXISTS (SELECT 1 FROM TABLE WHERE ID=1 AND CODE='2') THEN '100' WHEN EXISTS (SELECT 1 FROM TABLE WHERE ID=1 AND CODE='2') AND EXISTS (SELECT 1 FROM TABLE WHERE ID=1 AND CODE='3') THEN '200' WHEN EXISTS (SELECT 1 FROM TABLE WHERE ID=1 AND CODE='5') AND EXISTS (SELECT 1 FROM TABLE WHERE ID=1 AND CODE='7') THEN '300' END AS ASDASD;
注意事项
- 两种方案都会返回单一值:如果满足某组条件就返回对应结果,否则返回NULL。
- CASE语句是按顺序匹配的,如果一个ID同时满足多个条件(比如同时有1、2、3),会返回第一个匹配的结果,所以请把优先级高的条件放在前面。
内容的提问来源于stack exchange,提问作者Popplar
相关产品推荐
相关产品推荐

