Nas*_*ash 9 sql t-sql sql-server-2008
我在存储过程中有一个字符串,',,,sam,,bob,'或者',,,'
从上面的字符串中删除多个逗号,它必须看起来像
'sam,bob,'或者只有 ',,,' 当时 ''.我必须只使用Sql Server Functions.我使用的是Sql Server 2008和.Net 3.5
提前致谢.
这适用于仅使用逗号或最多包含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个字符的逗号部分.
我建议使用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)
| 归档时间: |
|
| 查看次数: |
9227 次 |
| 最近记录: |