SQL,删除行尾的逗号外观

时间:2009-11-06 11:30:48

标签: sql sql-server replace

我的数据如下

MyText
-------
some text, some more text, even more text,,
some text,,,,
some text, some text,,,
some text, some more text, even more, yet more, and again

我想实现:

MyText
-------
some text, some more text, even more text
some text
some text, some text
some text, some more text, even more, yet more, and again

如何删除行尾的逗号?我必须保留项目之间的逗号,但我需要从最后删除任何内容

我需要在select语句中执行此操作,并且我无法在不编写函数的情况下找到应用RegEx的解决方案(我希望避免使用)

我有一个解决方案,但它特别脏,我想改进它。我正在使用一组嵌套的REPLACE来替换4个逗号,3个用3个替换,2个用一个替换,然后删除最后一个

有什么想法吗?

编辑:数据来自外部系统,所以我无法控制,否则我会在第一个实例中正确连接逗号。我正在使用的这个语句将在SQL Server 2005上运行

6 个答案:

答案 0 :(得分:6)

尝试这样的事情

DECLARE @Table TABLE(
        Val VARCHAR(MAX)
)

INSERT INTO @Table (Val)  SELECT 'some text, some more text, even more text,,'
INSERT INTO @Table (Val)  SELECT 'some text,,,,'
INSERT INTO @Table (Val)  SELECT 'some text, some text,,,'
INSERT INTO @Table (Val)  SELECT 'some text, some more text, even more, yet more, and again'

SELECT  Val,
        REVERSE(SUBSTRING(  REVERSE(Val),   PATINDEX('%[A-Za-z0-9]%',REVERSE(Val)), LEN(VAL) - (PATINDEX('%[A-Za-z0-9]%',REVERSE(Val)) - 1) ) ),
        *
FROM    @Table

答案 1 :(得分:4)

试试这个 - 它类似于给定的答案,并且在文本中支持其他字符的附加好处(某些文本,某些文本!,,在给定的解决方案中无法正常工作)。它也有点短。

SELECT *, LEFT(val, LEN(val) - PATINDEX('%[^,]%', reverse(val)) + 1) FROM #TempTbl

作为参考,您可以在反向字符串中找到第一个非逗号字符,然后右键修剪初始字符串。

答案 2 :(得分:2)

我认为编写一个sclar函数对你来说将是一个“干净”的解决方案。

调用您的函数,说RemoveCommasAtEnd(sqlLine)

你只需在你的select语句中调用它。 在函数体中,输入逻辑以删除逗号。如果您需要帮助,请告诉我们

答案 3 :(得分:0)

可能有一个更好的解决方案,但作为最后的手段,你可以使用这样的循环:

while RIGHT(@theString, 1)=','
  select @theString=SUBSTRING(@theString, 1, LEN(@theString)-1)

(这至少适用于SQL Server)

答案 4 :(得分:0)

  

我正在使用一组嵌套的REPLACE   用3替换4个逗号,用2替换3   2,一个

以下内容需要一组正好三个嵌套REPLACE来“挤压”任意数量的多个逗号(CHAR(44))字符到单个字符:

WITH MyTable (MyText)
AS
(
 SELECT 'some text, some more text, even more text,,'
 UNION ALL
 SELECT 'some text,,,,'
 UNION ALL
 SELECT 'some text, some text,,,'
 UNION ALL
 SELECT 'some text, some more text, even more, yet more, and again'
)
SELECT REPLACE(
                REPLACE(
                        REPLACE(
                                MyText,CHAR(44), CHAR(44) + CHAR(22)
                               ), CHAR(22) + CHAR(44), ''
                      ), CHAR(22), ''
              ) AS MyText_commas_squeezed
  FROM MyTable;

现在你只需要修剪你已经知道如何做的任何尾随的单个逗号:)

答案 5 :(得分:0)

解决方案仅使用单个REVERSE。

SUBSTRING(myText,1,LEN(myText) - PATINDEX('%[A-Za-z0-9]%',REVERSE(myText))+ 1)

<强>演示:

WITH MyTable (MyText)
AS( 
              SELECT 'some text, some more text, even more text,,' 
    UNION ALL SELECT 'some text,,,,' 
    UNION ALL SELECT 'some text, some text,,,' 
    UNION ALL SELECT 'some text, some more text, even more, yet more, and again'
  )

SELECT SUBSTRING(myText, 1 , LEN(myText) - PATINDEX('%[A-Za-z0-9]%', REVERSE(myText)) + 1 ) from MyTable