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

SQL Server:实现逗号分隔字符串去重生成新列的查询方法

嘿,刚好碰到过类似的需求,在SQL Server里处理逗号分隔字符串去重其实不难,分版本给你几个实用的方案,你可以根据自己的SQL Server版本来选:

方法1:SQL Server 2017及以上版本(最简洁)

这个版本有STRING_AGG和STRING_SPLIT两个内置函数,直接组合用就搞定了,代码超简单:

SELECT 
    Column_A,
    STRING_AGG(DISTINCT value, ',') AS Column_B
FROM YourTable
CROSS APPLY STRING_SPLIT(Column_A, ',')
GROUP BY Column_A;

原理说明:

  • STRING_SPLIT(Column_A, ',') 把逗号分隔的字符串拆成一行行的单个值;
  • CROSS APPLY 把原表的每一行和拆分后的多行结果关联起来;
  • DISTINCT 自动去掉重复的内容;
  • STRING_AGG 把去重后的单个值再用逗号拼接回字符串,就是你要的Column_B啦!

方法2:SQL Server 2016版本(有STRING_SPLIT但无STRING_AGG)

2016版本还没出STRING_AGG,那咱们用FOR XML PATH来拼接字符串:

SELECT 
    Column_A,
    STUFF((
        SELECT DISTINCT ',' + value
        FROM STRING_SPLIT(t.Column_A, ',')
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS Column_B
FROM YourTable t;

原理说明:

  • 同样先用STRING_SPLIT拆分字符串;
  • 子查询里用FOR XML PATH('')把去重后的单个值拼接成带开头逗号的字符串(比如,karim,rahim...);
  • 最后用STUFF把开头多余的逗号去掉,就得到干净的结果了。

方法3:SQL Server 2016以下版本(无内置拆分函数)

如果你的SQL Server版本更老,连STRING_SPLIT都没有,那先自己写个拆分函数,再用上面的拼接逻辑:

第一步:创建自定义拆分函数

CREATE FUNCTION dbo.SplitString
(
    @InputString NVARCHAR(MAX),
    @Delimiter NVARCHAR(5)
)
RETURNS @OutputTable TABLE (Value NVARCHAR(MAX))
AS
BEGIN
    DECLARE @StartIndex INT, @EndIndex INT

    SET @StartIndex = 1
    -- 确保字符串末尾有分隔符,避免漏拆最后一个值
    IF SUBSTRING(@InputString, LEN(@InputString) - 1, LEN(@InputString)) <> @Delimiter
    BEGIN
        SET @InputString = @InputString + @Delimiter
    END

    WHILE CHARINDEX(@Delimiter, @InputString) > 0
    BEGIN
        SET @EndIndex = CHARINDEX(@Delimiter, @InputString)
        INSERT INTO @OutputTable(Value)
        SELECT SUBSTRING(@InputString, @StartIndex, @EndIndex - @StartIndex)
        SET @InputString = SUBSTRING(@InputString, @EndIndex + 1, LEN(@InputString))
    END

    RETURN
END

第二步:用函数查询去重后的结果

SELECT 
    Column_A,
    STUFF((
        SELECT DISTINCT ',' + Value
        FROM dbo.SplitString(t.Column_A, ',')
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS Column_B
FROM YourTable t;

你可以把上面的YourTable换成你实际的表名,测试一下你给的示例数据,肯定能得到你想要的结果!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:15:14