删除重复的重复字符

Nas*_*ash 9 sql t-sql sql-server-2008

我在存储过程中有一个字符串,',,,sam,,bob,'或者',,,' 从上面的字符串中删除多个逗号,它必须看起来像 'sam,bob,'或者只有 ',,,' 当时 ''.我必须只使用Sql Server Functions.我使用的是Sql Server 2008和.Net 3.5

提前致谢.

Mar*_*ith 8

这适用于仅使用逗号或最多包含398个连续逗号的字符串.

 SELECT 
     CASE 
         WHEN TargetString NOT LIKE '%[^,]%' 
             THEN '' /*The string is exclusively commas*/
         ELSE 
            REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TargetString,
            REPLICATE(',',16),','), /*399/16 = 24 remainder 15*/
            REPLICATE(',',8),','),  /* 39/ 8 =  4 remainder 7*/
            REPLICATE(',',4),','),  /* 11/ 4 =  2 remainder 3*/
            REPLICATE(',',2),','),  /*  5/ 2 =  2 remainder 1*/
            REPLICATE(',',2),',')   /*  3/ 2 =  1 remainder 1*/
         END
 FROM T    
Run Code Online (Sandbox Code Playgroud)

如果需要更多,可以在顶部添加2的额外功率,如果需要更少,则从顶部删除.每个阶段的评论表明该阶段不会成功处理的最小数量.

所有注释行都采用这种格式

/*  L/D    =  Q remainder R */

D:    Corresponds to the length of the string generated by `REPLICATE`
R:    Is always D-1
Q+R:  Form L for the next step
Run Code Online (Sandbox Code Playgroud)

因此,将该系列向上扩展到另一个REPLICATE(',',32),',')阶段

D = 32 
R = 31
Q = 368 (399-31)
L = (368 * 32) + 31 = 11807
Run Code Online (Sandbox Code Playgroud)

这样可以处理最多11,806个字符的逗号部分.


G M*_*ros 6

我建议使用UDF来做到这一点.由于我要建议的UDF不会触及任何表格,因此性能应该非常好.

CREATE Function [dbo].[CleanDuplicates](@Data VarChar(8000), @DuplicateChar VarChar(1))
Returns VarChar(8000)
WITH SCHEMABINDING
AS
Begin

    Set @Data = @DuplicateChar + @Data

    While PATINDEX('%' + @DuplicateChar + @DuplicateChar + '%',@Data) > 0
        Set @Data = REPLACE(@Data, @DuplicateChar + @DuplicateChar,@DuplicateChar)

    Return Right(@Data, Len(@Data)-1)

End
Run Code Online (Sandbox Code Playgroud)

您可以像这样测试函数:

Select dbo.CleanDuplicates(',,,', ',')
Select dbo.CleanDuplicates(',,,sam,,bob,', ',')
Run Code Online (Sandbox Code Playgroud)