You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:27:18