SQL根据多条件拼接不同列生成Nums字段实现方法
电话号码字段拼接查询方案
需求规则
需要从PhoneNumbers表查询时新增Nums列(待呼叫号码),取值逻辑:
- 手机号
MobileNum非空时,无论住宅号是否有值,优先取手机号拼接后缀MobileNum - 手机号为空、住宅号
ResidenceNum非空时,取住宅号拼接后缀ResidenceNum - 两个号码都为空时,
Nums返回NULL
测试环境初始化
先执行以下脚本完成建表和测试数据插入:
-- 建表 CREATE TABLE PhoneNumbers ( Id INT, Name VARCHAR(10), MobileNum VARCHAR(100), ResidenceNum VARCHAR(100) ) -- 插入测试数据 INSERT INTO PhoneNumbers VALUES (1,'Joey','9762575422',NULL), (2,'Ross', '9987796244','8762575402'), (3,'Chandler',NULL,'7645764689'), (4,'Monica','8902567839','7825367901'), (5,'Rachel',NULL,'7845637289'), (6,'Pheobe','9872435789','9838653469'), (7,'Gunther',NULL,NULL), (8,'Mike',NULL,'9700103678')
实现代码
直接用CASE WHEN判断即可,逻辑直观,兼容MySQL、SQL Server、PostgreSQL等所有主流SQL环境:
SELECT *, CASE WHEN MobileNum IS NOT NULL THEN CONCAT(MobileNum, 'MobileNum') WHEN ResidenceNum IS NOT NULL THEN CONCAT(ResidenceNum, 'ResidenceNum') ELSE NULL END AS Nums FROM PhoneNumbers
如果偏好更简洁的写法,也可以结合COALESCE函数(返回参数列表中第一个非NULL值)实现,效果完全一致:
SELECT *, CONCAT( COALESCE(MobileNum, ResidenceNum), CASE WHEN MobileNum IS NOT NULL THEN 'MobileNum' WHEN ResidenceNum IS NOT NULL THEN 'ResidenceNum' ELSE NULL END ) AS Nums FROM PhoneNumbers
返回结果说明
执行查询后,每条记录的Nums列值如下:
- Joey:9762575422MobileNum
- Ross:9987796244MobileNum
- Chandler:7645764689ResidenceNum
- Monica:8902567839MobileNum
- Rachel:7845637289ResidenceNum
- Pheobe:9872435789MobileNum
- Gunther:NULL
- Mike:9700103678ResidenceNum
内容的提问来源于stack exchange,提问作者Prabodh Purwar
相关产品推荐
相关产品推荐

