如何排除CTE中满足特定SupervisorID与UserID条件的记录?
解决你的CTE过滤问题
首先,先把你提供的CTE数据整理成更清晰的格式:
| ID | Name | UserID | SupervisorID |
|---|---|---|---|
| 1 | Mark | 1 | 2 |
| 2 | John | 1 | 1 |
| 3 | Julia | 3 | 1 |
| 4 | Tomm | 1 | 2 |
| 5 | Eric | 2 | 2 |
你的需求很明确:只要SupervisorID是1或者2,就排除所有UserID等于1的行,其他行都保留。
最直观的解决方案
其实不需要用CASE语句,直接用逻辑组合的WHERE条件就能轻松实现:
SELECT * FROM CTE WHERE NOT (SupervisorID IN (1, 2) AND UserID = 1);
这个语句的逻辑是:排除所有同时满足「SupervisorID是1或2」且「UserID等于1」的行,剩下的所有行都会被返回。
用CASE语句完成你的尝试
如果你坚持想用CASE来实现,也可以调整逻辑补全你的代码:
SELECT * FROM CTE WHERE UserID <> CASE WHEN SupervisorID IN (1, 2) THEN 1 ELSE NULL -- 当SupervisorID不是1/2时,返回NULL,UserID和NULL比较结果为UNKNOWN,不会排除该行 END;
不过这种写法不如第一种直观,推荐优先使用第一种逻辑清晰的写法。
验证结果
执行上述查询后,会返回以下两行数据:
| ID | Name | UserID | SupervisorID |
|---|---|---|---|
| 3 | Julia | 3 | 1 |
| 5 | Eric | 2 | 2 |
完全符合你的需求:排除了SupervisorID为1/2且UserID为1的行,保留了其他所有行。
内容的提问来源于stack exchange,提问作者tylkonachwile
相关产品推荐
相关产品推荐

