SQL实现员工办公与家庭手机号同值输出1行、异值输出2行查询
列拆行查询手机号实现方案
需求说明
Employee表结构如下:
| 字段名 | 说明 |
|---|---|
| EmpID | 员工ID |
| OfficeMobile | 办公手机号 |
| HomeMobile | 家庭手机号 |
查询规则:
- 输出列:
EmpID、ContactNo(联系电话) - 若员工办公手机号与家庭手机号相同,输出1行记录
- 若两个手机号不同,输出2行记录
示例源数据
| EmpID | OfficeMobile | HomeMobile |
|---|---|---|
| 1 | 123 | 123 |
| 2 | 456 | 789 |
预期输出
| EmpID | Contact number |
|---|---|
| 1 | 123 |
| 2 | 456 |
| 2 | 789 |
原有语句问题
原有CASE写法仅能在单条记录内完成字段值选择,无法实现列值拆分为多行的逻辑,满足不了不同号码输出2行的要求。
正确SQL写法
用UNION合并两个手机号的查询结果即可,UNION自带的去重特性刚好自动过滤同个员工相同号码的重复行,写法通用、兼容所有主流数据库:
-- 匹配你原有语句里的表名、字段名可直接使用 SELECT ed.empId, ed.mobile_number AS contact FROM employeeDetails AS ed UNION SELECT ed.empId, ed.home_number AS contact FROM employeeDetails AS ed ORDER BY empId;
如果对应表名、字段名和需求描述一致,可使用下面版本:
SELECT EmpID, OfficeMobile AS ContactNo FROM Employee UNION SELECT EmpID, HomeMobile AS ContactNo FROM Employee ORDER BY EmpID;
逻辑说明
- 第一段查询取出所有员工的办公手机号,第二段取出所有员工的家庭手机号
UNION会对两个查询的合并结果做全字段去重:同个员工两个手机号相同时,重复记录会被自动过滤,只保留1行;两个手机号不同时,两条记录都会保留,完全匹配需求- 末尾的
ORDER BY用于让同个员工的记录排列在一起,和示例输出顺序保持一致,可根据实际业务需要选择是否添加
内容的提问来源于stack exchange,提问作者shubh586
相关产品推荐
相关产品推荐

