SQL,删除行末逗号的出现

3
我的数据如下所示。
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语句中完成此操作,但是我没有找到一种不编写函数的应用正则表达式的解决方法(我希望避免这种方法)。我有一个解决方案,但它非常不规范,我想改进它。我使用一组嵌套的REPLACE将4个逗号替换为3个,3个替换为2个,2个替换为1个,然后删除末尾的一个。有什么建议吗?注:数据来自外部系统,因此我无法控制数据源,否则我会在第一次正确地使用逗号连接。我正在使用的语句将在SQL Server 2005上运行。

你使用的是哪个数据库服务器? - Cristian Ciupitu
抱歉,忘了提一下。SQL Server 2005。谢谢 :) - Jimmy
为什么一开始要在那里放逗号呢? - Lasse V. Karlsen
数据来自另一个我无法控制的系统。 - Jimmy
6个回答

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

将这个建议放入函数RemoveCommasAtEnd(sqlLine)中,你就会得到一个看起来不错且工作相当不错的东西。 - Henrik Staun Poulsen

4
尝试这个 - 它类似于给出的答案,还支持文本中的其他字符(在给定的解决方案中,一些文本,一些文本!,,, 无法正常工作)。它也稍微更短一些。
SELECT *, LEFT(val, LEN(val) - PATINDEX('%[^,]%', reverse(val)) + 1) FROM #TempTbl

为了参考,您需要在反转的字符串中找到第一个非逗号字符,然后通过该数量右侧修剪初始字符串。


2

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

调用您的函数,例如RemoveCommasAtEnd(sqlLine)

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


如果有这个选项,我必须同意这是最整洁的解决方案。 - Murph

0

可能有更好的解决方案,但作为最后的办法,您可以使用如下循环:

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

(这至少在SQL Server上有效)


0
我正在使用一组嵌套的REPLACE来将4个逗号替换为3个,3个替换为2个,2个替换为1个。
以下需要一组精确的三个嵌套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;

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


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

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