替换存储在列中的逗号分隔列表中的值

时间:2019-05-02 09:49:57

标签: sql-server tsql

按常规编程语言,这将是1行代码,但在SQL Server中似乎过于复杂。

给出一个表(是的,无需回答逗号分隔的值不应保留在列中):

| ID |  List        |
| 1  |  AB,ABC,ABCD |

将“ AB”仅替换为“ XX”并存储回表中的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

首先使用concat()在末尾附加逗号,以便每个元素都用逗号括起来。然后使用replace()替换元素,包括周围的逗号。最后,使用substring()来获取字符串,在开头和结尾处都不要使用逗号。

UPDATE elbat
       SET list = substring(replace(concat(',', list, ','), ',AB,', ',XX,'), 2, len(replace(concat(',', list, ','), ',AB,', ',XX,')) - 2);

db<>fiddle

答案 1 :(得分:0)

有点hacky和一团糟,并假设您的版本可以使用string_split,这将起作用:

DECLARE @TABLE TABLE (ID INT, List VARCHAR(100))
INSERT INTO @TABLE VALUES
(1, 'AB,ABC,ABCD')


SELECT  ID
       ,STUFF((SELECT ', ' + CAST(IIF(value = 'AB', 'XX', value) AS VARCHAR(10)) [text()]
         FROM @TABLE 
         CROSS APPLY string_split (List,',')
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,2,' ') List_Output
FROM @TABLE t

返回:

ID  List_Output
1    XX, ABC, ABCD