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

使用Pivot表IN关键字时,如何为每个值添加方括号包裹?

解决方法:拆分字符串后逐个添加方括号

哦,我明白你遇到的问题了——你现在是把整个逗号分隔的字符串直接丢进QUOTENAME里,所以它把整段内容都包成一个方括号块了对吧?要让每个单独的名字都带上方括号,关键得先把字符串拆成单个元素,再分别处理,最后再拼接起来。

推荐方案(SQL Server 2016 及以上版本)

如果你的SQL Server版本支持STRING_SPLIT和STRING_AGG(这两个函数在2016及以后版本可用),这是最简洁高效的写法:

DECLARE @t varchar(max) = 'jay, sam';

SELECT STRING_AGG(QUOTENAME(TRIM(value)), ',') AS CityNames
FROM STRING_SPLIT(@t, ',');

代码解释:

  1. STRING_SPLIT(@t, ','):把你的逗号分隔字符串拆分成单独的行,每行对应一个名字(用TRIM去掉名字前后的空格,避免出现[jay], [sam]这种带空格的冗余格式)。
  2. QUOTENAME(TRIM(value)):给每个单独的名字加上方括号。
  3. STRING_AGG(..., ','):把所有带方括号的名字用逗号拼接起来,最终得到你想要的[jay],[sam]。

兼容旧版本的方案(SQL Server 2016 之前)

如果你的版本不支持上面的函数,可以用递归CTE来拆分字符串,再逐个拼接:

DECLARE @t varchar(max) = 'jay, sam';
DECLARE @CityNames NVARCHAR(MAX) = '';

-- 用递归CTE拆分字符串
WITH SplitNames AS (
    SELECT 
        LTRIM(RTRIM(SUBSTRING(@t, 1, CHARINDEX(',', @t + ',') - 1))) AS Name,
        SUBSTRING(@t, CHARINDEX(',', @t + ',') + 1, LEN(@t)) AS Remaining
    WHERE @t <> ''
    UNION ALL
    SELECT 
        LTRIM(RTRIM(SUBSTRING(Remaining, 1, CHARINDEX(',', Remaining + ',') - 1))),
        SUBSTRING(Remaining, CHARINDEX(',', Remaining + ',') + 1, LEN(Remaining))
    FROM SplitNames
    WHERE Remaining <> ''
)
-- 逐个拼接带方括号的名字
SELECT @CityNames += QUOTENAME(Name) + ','
FROM SplitNames;

-- 去掉最后多余的逗号
SELECT LEFT(@CityNames, LEN(@CityNames) - 1) AS CityNames;

这个方法通过递归逐步拆分字符串,取出每个名字后添加方括号,最后去掉拼接时多出来的末尾逗号,同样能得到[jay],[sam]的结果。

内容的提问来源于stack exchange,提问作者S M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:36:46