SQL Server中如何使用CASE语句实现布尔列值的字符串拼接
代码失效原因
你的原有写法存在两个核心逻辑问题:
- T-SQL中
CASE表达式按书写顺序匹配,只要命中第一个WHEN分支就会直接返回结果,后续分支完全不会执行。只要Smoke或Invoice字段值为1,后面Party/Summary等字段的判断逻辑会被直接跳过,不可能拼接出完整字符串。 - 借助会话变量
@concat做逐段累加的写法在SQL Server中没有执行确定性,查询优化器可能调整执行顺序导致拼接结果混乱,不属于官方推荐的可靠写法。
正确实现
不需要定义额外变量,直接通过CONCAT函数对每个片段做独立判断拼接即可,各段判断互不干扰,当所有判断字段值为1时会自动返回GGPNES:
SELECT Smoke, Invoice, Party, Summary, MySelf, Export, CONCAT( CASE WHEN Smoke = 1 AND Invoice = 1 THEN 'GG' ELSE '' END, CASE WHEN Party = 1 THEN 'P' ELSE '' END, CASE WHEN Summary = 1 THEN 'N' ELSE '' END, CASE WHEN MySelf = 1 THEN 'E' ELSE '' END, CASE WHEN Export = 1 THEN 'S' ELSE '' END ) AS ConcatResult FROM MyTable
逻辑说明:按照你给出的「所有字段为真时输出GGPNES」的规则,
GG片段需要Smoke和Invoice两个字段同时为1才会拼接,所以第一个判断用AND关联。如果你的实际需求是两个字段任意一个为1就拼接GG,把AND替换为OR即可。
如果使用SQL Server 2012及以上版本,可以用IIF简化写法:
SELECT Smoke, Invoice, Party, Summary, MySelf, Export, CONCAT( IIF(Smoke = 1 AND Invoice = 1, 'GG', ''), IIF(Party = 1, 'P', ''), IIF(Summary = 1, 'N', ''), IIF(MySelf = 1, 'E', ''), IIF(Export = 1, 'S', '') ) AS ConcatResult FROM MyTable
内容的提问来源于stack exchange,提问作者ahmad nizar
相关产品推荐
相关产品推荐

