使用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, ',');
代码解释:
STRING_SPLIT(@t, ','):把你的逗号分隔字符串拆分成单独的行,每行对应一个名字(用TRIM去掉名字前后的空格,避免出现[jay], [sam]这种带空格的冗余格式)。QUOTENAME(TRIM(value)):给每个单独的名字加上方括号。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
相关产品推荐
相关产品推荐

