如何简化T-SQL SELECT查询中的该段CASE语句?
SQL CASE逻辑简化方案
需求说明
需要实现的字段计算规则:
- 当
COL_B、COL_C均不为NULL且不为空字符串时,返回CONCAT(COL_B, ' - ', COL_C)拼接结果 - 两列中仅一列非NULL且非空时,返回该列的有效值
- 两列均为NULL或空串时返回NULL
原实现代码
SELECT COL_A AS [A], CASE WHEN NULLIF(COL_B, '') IS NOT NULL AND NULLIF(COL_C, '') IS NOT NULL THEN CONCAT(COL_B, ' - ', COL_C) WHEN NULLIF(COL_B, '') IS NULL AND NULLIF(COL_C, '') IS NOT NULL THEN COL_C WHEN NULLIF(COL_B, '') IS NOT NULL AND NULLIF(COL_C, '') IS NULL THEN COL_B END AS [B]
更简洁的实现方式
当前写法不是唯一可行方案,利用CONCAT_WS函数的特性可以大幅简化代码,逻辑和原实现完全等价:
SELECT COL_A AS [A], CONCAT_WS(' - ', NULLIF(COL_B, ''), NULLIF(COL_C, '')) AS [B] FROM 你的表名
逻辑说明
- 先用
NULLIF(列名, '')把空字符串统一转换为NULL,对齐原逻辑中“空串视为无效值”的判断规则 CONCAT_WS函数会自动跳过参数中的NULL值,不会拼接多余的分隔符:- 两列都有有效值:自动用
' - '拼接两列,完全匹配预期格式 - 仅一列有有效值:跳过NULL列直接返回该有效值,不会残留多余分隔符
- 两列均为无效值:返回NULL,和原逻辑返回结果一致
- 两列都有有效值:自动用
低版本兼容写法
如果使用的数据库版本不支持CONCAT_WS(比如SQL Server 2016及更早版本),可以简化原CASE逻辑,减少重复判断:
SELECT COL_A AS [A], CASE WHEN NULLIF(COL_B, '') IS NULL THEN NULLIF(COL_C, '') WHEN NULLIF(COL_C, '') IS NULL THEN COL_B ELSE CONCAT(COL_B, ' - ', COL_C) END AS [B] FROM 你的表名
内容的提问来源于stack exchange,提问作者Patrick S
相关产品推荐
相关产品推荐

