sql - SQL Server 中的 TrimEnd 等效项

标签 sql sql-server-2008 trim

我有列(数字),其值如下:

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

关于sql - SQL Server 中的 TrimEnd 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28190872/

相关文章:

sql - 我如何学习优化 SQL 查询

sql - Sybase - 设置控制台输出以打印日志语句

sql全文查询表达式,如何知道sql匹配了哪些形式的同义词?

c++ - boost/algorithm/string/trim.hpp 编译错误

sql - 使用 SED 匹配 sql 转储中的电子邮件并替换它们

mysql - 如何为列值的组合选择行

sql - 如何从 Sproc 中识别存储过程的调用者

sql-server - 如何在 Sql Server 2008 表上启用全文索引

php - !空(修剪($_POST ['username']

JavaScript trim 对象的所有自己的属性键名称?