SQL Server中的TrimEnd等价函数

11

我有一个列(数字), 它的值如下:

1,2,3
1,2,3,
1,2,3,,,
1,2,3,,,,,,

我想去掉字符串结尾的所有逗号,以便结果是:

1,2,3
1,2,3
1,2,3
1,2,3

我尝试了下面的查询语句,但是它只能删除最后一个逗号

DECLARE @String as VARCHAR(50)
SET @String='1,2,3,4,,,,,,,,,,,,,,,,'

SELECT CASE WHEN right(rtrim(@String),1) = ',' then substring(rtrim(@String),1,len(rtrim(@String))-1)
    ELSE @String 
    END AS TruncString

我该如何删除字符串末尾的所有逗号?

6个回答

10
您可以使用以下方法实现此操作:
LEFT(Numbers, LEN(Numbers) - (PATINDEX('%[^,]%', REVERSE(Numbers)) - 1))

首先,需要使用REVERSE函数将字符串反转:

REVERSE(Numbers) --> ,,,,,,3,2,1

然后使用PATINDEX函数和模式匹配[^,]查找第一个不是逗号的字符的位置:

PATINDEX('%[^,]%', REVERSE(Numbers)) --> ,,,,,,3,2,1 = 7

然后您可以使用LEN函数获取字符串的长度,以获得反向位置,即如果第一个不是逗号的字符在反转后的字符串中的位置为7,并且字符串的长度为10,则需要字符串的前4个字符。 然后使用SUBSTRING函数提取相关部分。
完整示例如下:
SELECT  Numbers,
        Reversed = REVERSE(Numbers),
        Position = PATINDEX('%[^,]%', REVERSE(Numbers)),
        TrimEnd = LEFT(Numbers, LEN(Numbers) - (PATINDEX('%[^,]%', REVERSE(Numbers)) - 1))
FROM    (VALUES 
            ('1,2,3'), 
            ('1,2,3,'), 
            ('1,2,3,,,'), 
            ('1,2,3,,,,,,'), 
            ('1,2,3,,,5,,,'), 
            (',,1,2,3,,,5,,')
        ) t (Numbers);

编辑

针对一次编辑,其中语法有些错误,下面是修剪开头和修剪逗号两侧的函数:

SELECT  Numbers,
        Reversed = REVERSE(Numbers),
        Position = PATINDEX('%[^,]%', REVERSE(Numbers)),
        TrimEnd = LEFT(Numbers, LEN(Numbers) - (PATINDEX('%[^,]%', REVERSE(Numbers)) - 1)),
        TrimStart = SUBSTRING(Numbers, PATINDEX('%[^,]%', Numbers), LEN(Numbers)),
        TrimBothSide = SUBSTRING(Numbers, 
                                    PATINDEX('%[^,]%', Numbers), 
                                    LEN(Numbers) - 
                                        (PATINDEX('%[^,]%', REVERSE(Numbers)) - 1) - 
                                        (PATINDEX('%[^,]%', Numbers) - 1)
                                    )
FROM    (VALUES 
            ('1,2,3'), 
            ('1,2,3,'), 
            ('1,2,3,,,'), 
            ('1,2,3,,,,,,'), 
            ('1,2,3,,,5,,,'), 
            (',,1,2,3,,,5,,')
        ) t (Numbers);

这是我在这个主题上见过的最完整的答案。非常感谢! :) - Vítor Martins

2

由于存在多个出现次数,您不能使用简单的内置函数表达式来完成此操作,但是一个简单的用户定义函数可以完成此任务。

create function dbo.MyTrim(@text varchar(max)) returns varchar(max)
as
-- function to remove all commas from the right end of the input.
begin

    while (right(@text, 1) = ','
    begin
        set @text = left(@text, len(@text) - 1)
    end

    return @text

end
go

2
您可以搜索第一次出现的',,',并获取其前面的所有内容:
select (case when numbers like '%,,'
             then left(numbers, charindex(',,', numbers) - 1)
             when numbers like '%,'
             then left(numbers, len(numbers) - 1)
             else numbers
        end)

注意:看起来你正在用逗号分隔的字符串中存储一些列表。通常最好使用连接表来存储这些内容。
编辑:
或者,另一种不需要使用 case 的表述方式是:
select left(numbers + ',,', charindex(',,', numbers + ',,') - 1)

它会产生结果,但不包括1、2、3。 - Vignesh Kumar A
是的,现在已经修复了。但是对于这个 ',,1,2,3,,,5,,' 还没有生效。这不是我的问题,只是我说了一句话。 - Vignesh Kumar A
1
@VigneshKumar . . . 这个问题是关于“TrimEnd等效”的。如果您有不同的问题,应该将其作为一个问题提出。 - Gordon Linoff
1
@GordonLinoff,我认为这是一个合理的评论。如果他有一个字符串1,2,,3,,,5,,,,,,那么仅仅查找第一次出现的,,并从该位置剥离所有内容是行不通的。他只想修剪尾随的逗号。 - David Faber
@DavidFaber……没关系。这只是另一个问题,这不是答案。 - Gordon Linoff

1

SQL Server 2017实现了TRIM函数的增强版本。您可以使用TRIM(',' FROM '1,2,3,,,')来获取字符串'1,2,3'


问题在 SQL 2017 之前。但这现在是最佳答案,使其他答案过时了。对我很有效。 - Kevin UI

0

运行以下查询并获取预期结果

declare @sql varchar(500)

set @sql ='1,2,3,,,,,,'

select left(@sql,case charindex(',,',@sql,0)
when 0 then len(@sql)-1
else charindex(',,',@sql,0)-1
end)

如果 @sql 是 '1,,2,3,,,,,,',会返回只有 1。 - good-to-know

0
Create FUNCTION TrimStartEndAll 
(
    @string varchar(max),
    @trimValue varchar(5),
    @removeall int=0 
)

RETURNS varchar(max)
AS
BEGIN

    if @removeall=1
    while  CHARINDEX(@trimValue,@string) >0 and @removeall=1
    begin
        set @string = REPLACE(@string,@trimValue,'')
    end
    if @removeall = 0
        begin

             while  CHARINDEX(@trimValue,@string) =1
                begin
                    set @string = SUBSTRING(@string,len(@trimValue)+1, len(@string))
                end

             while  substring(@string,len(@string)-len(@trimValue)+1, len(@trimValue)) = @trimValue
                begin
                    set @string =substring(@string,0, (len(@string)-len(@trimValue)+1))
                end
         end
    return @string
END
GO

输出

select dbo.TrimStartEndAll( ',,1,2,3,,,5,,,,,,,,,',',,',1) => 1,2,3,5,
select dbo.TrimStartEndAll( ',,1,2,3,,,5,,,,,,,,,',',,',0) => 1,2,3,,,5,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接