如何编写SQL实现非空姓名字段按指定格式拼接输出
SQL拼接指定格式姓名字段实现方案
核心实现逻辑
- 对每个姓名字段单独做非空校验,非空时返回
前缀:字段值格式的片段,为空时返回NULL - 用支持自动忽略NULL值的拼接函数,用逗号作为分隔符拼接所有有效片段,避免出现多余逗号
- 最后处理三个字段全为空的场景,将NULL结果转为空字符串
不同数据库具体实现代码
MySQL 实现
MySQL自带的CONCAT_WS函数天然支持忽略NULL值,适配需求:
SELECT IFNULL( CONCAT_WS( ',', IF(F_NAME IS NOT NULL, CONCAT('FirstName:', F_NAME), NULL), IF(M_NAME IS NOT NULL, CONCAT('MiddleName:', M_NAME), NULL), IF(L_NAME IS NOT NULL, CONCAT('LastName:', L_NAME), NULL) ), '' ) AS EMPLOYEE FROM PERSON WHERE PERSON_DEPT = 'HR';
Oracle 实现
用NVL2做非空判断,配合TRIM去除多余逗号:
SELECT NVL( TRIM(',' FROM NVL2(F_NAME, 'FirstName:' || F_NAME, NULL) || NVL2(M_NAME, ',MiddleName:' || M_NAME, NULL) || NVL2(L_NAME, ',LastName:' || L_NAME, NULL) ), '' ) AS EMPLOYEE FROM PERSON WHERE PERSON_DEPT = 'HR';
SQL Server 实现(2017及以上版本)
高版本SQL Server支持CONCAT_WS函数,用法和MySQL一致:
SELECT ISNULL( CONCAT_WS( ',', CASE WHEN F_NAME IS NOT NULL THEN CONCAT('FirstName:', F_NAME) END, CASE WHEN M_NAME IS NOT NULL THEN CONCAT('MiddleName:', M_NAME) END, CASE WHEN L_NAME IS NOT NULL THEN CONCAT('LastName:', L_NAME) END ), '' ) AS EMPLOYEE FROM PERSON WHERE PERSON_DEPT = 'HR';
效果校验
- 单个字段为空时,对应片段会被自动跳过,不会出现多余逗号
- 三个字段全为空时,拼接结果为NULL,最外层判空函数会将其转为空字符串,完全符合需求规则
内容的提问来源于stack exchange,提问作者Andulos
相关产品推荐
相关产品推荐

