如何在SQL的WHERE子句中多次使用同一列
解决WHERE子句中同一列多条件筛选的问题
嘿,先提个关键问题:你写的示例查询逻辑上有矛盾哦——同一行的CATEGORY不可能同时等于1和2,所以这个查询会返回空结果。我猜你真正想要的是找出那些同时拥有两种符合条件记录的员工:比如某员工既有CATEGORY=1且STATUS包含'A'的记录,又有CATEGORY=2且STATUS='B'的记录,对吧?下面给你几种靠谱的实现方式:
方式1:用EXISTS子查询(直观且性能友好)
这种方式适合精准匹配员工是否满足多个独立条件,尤其是当表上有EMPLOYEE、CATEGORY这类字段的索引时,性能很不错:
SELECT DISTINCT EMPLOYEE FROM EMPLOYMENT e_main WHERE EXISTS ( -- 检查该员工是否有CATEGORY=1且STATUS含'A'的记录 SELECT 1 FROM EMPLOYMENT e_sub1 WHERE e_sub1.EMPLOYEE = e_main.EMPLOYEE AND e_sub1.CATEGORY = 1 AND e_sub1.STATUS LIKE '%A%' ) AND EXISTS ( -- 检查该员工是否有CATEGORY=2且STATUS='B'的记录 SELECT 1 FROM EMPLOYMENT e_sub2 WHERE e_sub2.EMPLOYEE = e_main.EMPLOYEE AND e_sub2.CATEGORY = 2 AND e_sub2.STATUS = 'B' );
如果需要返回该员工的所有相关记录,你可以在这个基础上做JOIN,或者调整查询范围。
方式2:用GROUP BY + HAVING(适合统计类需求)
如果你的需求是先筛选出符合任一条件的行,再找出同时满足两种条件的员工,这种方式很简洁:
SELECT EMPLOYEE FROM EMPLOYMENT WHERE (CATEGORY = 1 AND STATUS LIKE '%A%') OR (CATEGORY = 2 AND STATUS = 'B') GROUP BY EMPLOYEE HAVING COUNT(DISTINCT CATEGORY) = 2; -- 确保两种分类的记录都存在
这里用COUNT(DISTINCT CATEGORY)是为了避免同一个员工多条同分类记录干扰统计结果,如果你的数据里每个员工每个分类只有一条记录,直接用COUNT(*)也可以。
方式3:用窗口函数(返回所有符合条件的行)
如果你需要返回所有满足条件的员工的相关行(而不仅仅是员工ID),窗口函数是个好选择:
WITH employee_check AS ( SELECT EMPLOYEE, CATEGORY, STATUS, -- 标记该员工是否有CATEGORY=1的符合条件记录 MAX(CASE WHEN CATEGORY=1 AND STATUS LIKE '%A%' THEN 1 ELSE 0 END) OVER (PARTITION BY EMPLOYEE) AS has_cat1, -- 标记该员工是否有CATEGORY=2的符合条件记录 MAX(CASE WHEN CATEGORY=2 AND STATUS='B' THEN 1 ELSE 0 END) OVER (PARTITION BY EMPLOYEE) AS has_cat2 FROM EMPLOYMENT ) SELECT EMPLOYEE, CATEGORY, STATUS FROM employee_check WHERE has_cat1 = 1 AND has_cat2 = 1;
补充:如果是筛选符合任一条件的行
要是你的需求其实只是找出所有符合CATEGORY=1且STATUS含'A'或者CATEGORY=2且STATUS='B'的行,那只需要把原查询的AND改成OR就行:
SELECT EMPLOYEE, CATEGORY, STATUS FROM EMPLOYMENT WHERE (CATEGORY = 1 AND STATUS LIKE '%A%') OR (CATEGORY = 2 AND STATUS = 'B');
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

