如何通过自连接或子查询实现同一列分两次展示不同结果?
解决方法
你的需求不需要复杂的自连接,直接通过条件判断就能实现:当部门名称包含&或'时,在dep2列显示该部门名,否则dep2留空。
最简实现SQL
SELECT dep AS dep1, CASE WHEN dep LIKE '%&%' OR dep LIKE "%'%" THEN dep ELSE NULL END AS dep2 FROM test_deps;
原查询的问题分析
- 用
INNER JOIN会强制两张表的id完全匹配,导致无法保留不满足条件的部门(比如Admissions)的dep1记录,内连接会直接过滤掉不匹配的行。 WHERE子句的逻辑运算符优先级错误:AND优先级高于OR,导致实际执行逻辑和预期不符,筛选出的结果集混乱。
自连接实现方案(左连接版)
如果一定要用自连接,可以用左连接保留所有部门的dep1,仅将满足条件的部门匹配到dep2:
SELECT h1.dep AS dep1, h2.dep AS dep2 FROM test_deps h1 LEFT JOIN test_deps h2 ON h1.id = h2.id AND (h2.dep LIKE '%&%' OR h2.dep LIKE "%'%");
最终返回结果示例:
| dep1 | dep2 |
|---|---|
| Admissions | NULL |
| CAPS - Dean's Office | CAPS - Dean's Office |
| Parking & Transportation | Parking & Transportation |
内容的提问来源于stack exchange,提问作者user1469
相关产品推荐
相关产品推荐

