【问题标题】:how to remove duplicates from a comma seperated string in sql server如何从sql server中的逗号分隔字符串中删除重复项
【发布时间】:2018-01-08 11:58:46
【问题描述】:

如何从 sql server 中的逗号分隔字符串中删除重复值。不使用函数

 Declare @data varchar(max) = '34.22,768.55,34.22,123.34,12,999.0,999.0'

我的预期结果应该是

34.22,768.55,123.34,12,999.0

我尝试了这个查询,但它没有从变量中删除重复项。

Declare @data varchar(max) = '34.22,768.55,34.22,123.34,12,999.0,999.0'
set @data= (select '' + cast(cast('<d>'+replace(@data, ', ',',</d><d>')+'</d>'  as xml).query('distinct-values(/d)') as varchar(max)) +'')

【问题讨论】:

  • 你不想使用函数的原因是什么?

标签: sql-server


【解决方案1】:

请试试这个 -

DECLARE @x AS XML=''
Declare @finalstring varchar(max) = ''
DECLARE @Param AS VARCHAR(100) = '34.22,768.55,34.22,123.34,12,999.0,999.0'
SET @x = CAST('<A>'+ REPLACE(@Param,',','</A><A>')+ '</A>' AS XML)
select @finalstring = @finalstring + value + ',' from ( 
SELECT t.value('.', 'VARCHAR(10)') Value FROM @x.nodes('/A') AS x(t))p
GROUP BY value
PRINT SUBSTRING(@finalstring,0,LEN(@finalstring))

输出

12,123.34,34.22,768.55,999.0

适用于 sql 2016+

Declare @data varchar(max) = '34.22,768.55,34.22,123.34,12,999.0,999.0'
Declare @finalstring varchar(max) = ''
select @finalstring = @finalstring + value + ',' from string_split(@data,',')
GROUP BY value
PRINT SUBSTRING(@finalstring,0,LEN(@finalstring))

输出

12,123.34,34.22,768.55,999.0

【讨论】:

  • 问题是,OP 声明“不使用函数”。您在这里使用STRING_SPLIT 函数。但是,我很想知道为什么 OP 不想使用一个。
  • 是的,你是对的,不知道为什么不使用这些功能。 STRING_SPLIT 是分割字符串的最佳方法。
  • 我喜欢 2016+ 的这个答案
  • 这可以作为2016+的计算列吗?
【解决方案2】:

试试这个

Declare @data varchar(max) = '34.22,768.55,34.22,123.34,12,999.0,999.0'

SELECT STUFF(
(
    SELECT DISTINCT ',' + UniqNum FROM
    (
        SELECT CAST('<d>'+replace(@data, ',','</d><d>')+'</d>' AS XML) AS numberXml
    ) as t1
    CROSS APPLY 
    (
     SELECT my_Data.D.value('.','varchar(50)') as UniqNum
     FROM t1.numberXml.nodes('d') as my_Data(D)
    ) t2
    FOR XML PATH('')
), 1, 1, '')

结果

UniqNumber
---------------------------
12,123.34,34.22,768.55,999.0

【讨论】:

    【解决方案3】:

    试试这个

    Declare @data varchar(max) = '34.22,768.55,34.22,123.34,12,999.0,999.0'
    
     ;WITH CTE
     AS
     (
        SELECT
            MyStr = SUBSTRING(@data,CHARINDEX(',',@Data)+1,LEN(@data)),
            Val = SUBSTRING(@data,1,CHARINDEX(',',@data)-1)
    
        UNION ALL
    
        SELECT
            MyStr = CASE WHEN CHARINDEX(',',MyStr)>0
                            THEN SUBSTRING(MyStr,CHARINDEX(',',MyStr)+1,LEN(MyStr))
                        ELSE NULL END,
            Val = CASE WHEN CHARINDEX(',',MyStr)>0
                            THEN SUBSTRING(MyStr,1,CHARINDEX(',',MyStr)-1)
                        ELSE MyStr END
            FROM CTE
                WHERE ISNULL(REPLACE(MyStr,',',''),'')<>''
     )
     SELECT
        Val = SUBSTRING(List,1,LEN(List)-1)
        FROM
         (
         SELECT
            DISTINCT Val+','
            FROM CTE
                WHERE ISNULL(MyStr ,'')<>''
                FOR XML PATH('')
        )Q(List)
    

    我的结果

    12,123.34,34.22,768.55,999.0
    

    【讨论】:

      【解决方案4】:

      只是另一种简单的方法。

      Declare @data Nvarchar(max) = N'34.22,768.55,34.22,123.34,12,999.0,999.0'
           , @data2 Nvarchar(max)='';
      SELECT @data = N'SELECT @DATA_DIST= @DATA_DIST+VAL+'','' 
           FROM (SELECT '''+replace(@data,',',''' AS VAL UNION SELECT ''')+''')A';
      EXECUTE sp_executesql @data,N'@DATA_DIST varchar(MAX) OUTPUT',@DATA_DIST=@data2 OUTPUT;
      SELECT LEFT(@data2,LEN(@data2)-1);
      

      结果:

      12,123.34,34.22,768.55,999.0

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 2018-08-27
        • 2021-12-21
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 2016-12-23
        • 2016-05-21
        相关资源
        最近更新 更多