簡體   English   中英

SQL Server中的TrimEnd等效項

[英]TrimEnd Equivalent in SQL Server

我有列(Numbers),其值如下:

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

如何刪除字符串末尾的所有逗號?

你可以這樣做:

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);

因為有多次出現你不能使用簡單的內置函數表達式,但是一個簡單的用戶定義函數可以完成這項工作。

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

您可以搜索第一次出現',,'並在此之前采取一切措施:

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)

運行以下查詢並獲得預期結果

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)
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,

SQL Server 2017實現了TRIM功能的增強版本。 您可以使用TRIM(','FROM'1,2,3 ,,,')來獲取字符串'1,2,3'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM