SQL问题:如何判断一组ID是否全部存在于指定列表,无需逐个编写IIF语句
问题描述
我有一组无顺序的数字ID(示例:100, 101, 102, 103, 104, 151, 125, 126, 152, 155, 156, 158, 160, 153, 166, 167, 120),这些ID对应更高价值。现在需要实现:给定一组值(比如103、126),如果所有值都在这组ID列表里,返回"good";只要有一个值不在,就返回"fail"。我已经尝试用IN语句写了查询:select user, usercode from usertable where usercode in (100, 101, 102, 103, 104, 151, 125, 126, 152, 155, 156, 158, 160, 153, 166, 167, 120),想问有没有必要为每个组合都写IIF语句?
解决方案
完全没必要为每个组合单独写IIF语句,有几种更简洁的实现方式:
方法1:通过聚合计数判断
假设你要检查的目标值是103,126,可以用统计匹配数量的方式来判断:
SELECT CASE WHEN COUNT(DISTINCT usercode) = 2 THEN 'good' ELSE 'fail' END AS result FROM usertable WHERE usercode IN (103, 126)
- 逻辑:如果两个目标值都存在于高价值ID列表里,查询返回的去重后行数就是2,返回"good";只要有一个值不存在,行数就会小于2,返回"fail"。
- 注意:把
COUNT(DISTINCT usercode)后面的数字改成你要检查的目标值的总个数就行。
方法2:用EXCEPT检查缺失值
要是不想硬编码目标值的数量,也可以用EXCEPT找出不在高价值列表里的目标值:
SELECT CASE WHEN NOT EXISTS ( SELECT * FROM (VALUES (103), (126)) AS target(id) EXCEPT SELECT usercode FROM usertable WHERE usercode IN (100, 101, 102, 103, 104, 151, 125, 126, 152, 155, 156, 158, 160, 153, 166, 167, 120) ) THEN 'good' ELSE 'fail' END AS result
- 逻辑:EXCEPT会返回目标值里不在高价值ID列表的部分,如果这部分为空,说明所有目标值都符合要求,返回"good"。
长期优化方案
如果这组高价值ID经常用到,建议把它们单独存成一个表(比如high_value_ids),后续维护和查询都会更方便:
-- 先创建高价值ID表 CREATE TABLE high_value_ids (id INT PRIMARY KEY); -- 把所有高价值ID插入表中 INSERT INTO high_value_ids VALUES (100), (101), (102), (103), (104), (151), (125), (126), (152), (155), (156), (158), (160), (153), (166), (167), (120); -- 检查目标值的查询语句 SELECT CASE WHEN COUNT(DISTINCT t.id) = (SELECT COUNT(*) FROM (VALUES (103), (126)) AS t(id)) THEN 'good' ELSE 'fail' END AS result FROM (VALUES (103), (126)) AS t(id) JOIN high_value_ids hv ON t.id = hv.id;
内容的提问来源于stack exchange,提问作者Trip Burton
相关产品推荐
相关产品推荐

