如何使用CASE表达式判断ID值所属的数据表
SQL查询ID所属表实现方案
你原有CASE语句的问题在于,当某一侧表的ID为NULL时,A.ID != B.ID的判断结果为未知值,不会命中后续分支,需要调整判断逻辑,同时要先对两张表做全外关联才能同时拿到两侧的ID数据。
完整实现代码
写法1:全外连接+CASE判断(支持 PostgreSQL、SQL Server、Oracle、高版本MySQL)
SELECT COALESCE(A.ID, B.ID) AS 查询ID, CASE WHEN A.ID IS NOT NULL AND B.ID IS NOT NULL THEN '两张表都存在' WHEN A.ID IS NOT NULL THEN '仅存在于表A' WHEN B.ID IS NOT NULL THEN '仅存在于表B' ELSE '无匹配记录' END AS 所属表标识 FROM A FULL OUTER JOIN B ON A.ID = B.ID -- 如需查询单个指定ID,打开下方注释替换目标值即可 -- WHERE COALESCE(A.ID, B.ID) = 31101535;
写法2:UNION合并+聚合统计(兼容所有SQL数据库,包括低版本MySQL)
SELECT ID, CASE WHEN COUNT(*) = 2 THEN '两张表都存在' WHEN MAX(来源表) = 'A' THEN '仅存在于表A' ELSE '仅存在于表B' END AS 所属表标识 FROM ( SELECT ID, 'A' AS 来源表 FROM A UNION ALL SELECT ID, 'B' AS 来源表 FROM B ) t -- 如需查询单个指定ID,打开下方注释替换目标值即可 -- WHERE ID = 31101535 GROUP BY ID;
示例运行结果
基于你给出的测试数据,全量查询的输出结果如下:
- 31101530:仅存在于表B
- 31101533:仅存在于表B
- 31101534:仅存在于表A
- 31101535:两张表都存在
- 31101536:仅存在于表A
内容的提问来源于stack exchange,提问作者user15265211
相关产品推荐
相关产品推荐

