Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 替换存储在列中的逗号分隔列表中的值_Sql Server_Tsql - Fatal编程技术网

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

Sql server 替换存储在列中的逗号分隔列表中的值,sql-server,tsql,Sql Server,Tsql,这在普通编程语言中是一行代码,但在SQL Server中似乎过于复杂 给定一个表(是无需回答逗号分隔的值不应保留在列中): 例如,将“AB”替换为“XX”并存储在表中的后面的最佳方法是什么?首先使用concat()在末尾附加COMA,以便每个元素都用逗号括起来。然后使用replace()替换元素,包括周围的逗号。最后,使用substring()获取开头和结尾不带逗号的字符串 UPDATE elbat SET list = substring(replace(concat(',',

这在普通编程语言中是一行代码,但在SQL Server中似乎过于复杂

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


例如,将“AB”替换为“XX”并存储在表中的后面的最佳方法是什么?

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

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

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

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

有点老掉牙,乱七八糟,假设您的版本可以使用string\u 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

有点黑客和混乱,假设您的版本可以使用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

全部为“AB”还是仅为不同的值AB?您使用的是什么版本的sql server?在较新的函数中,有一些漂亮的函数可能是有用的“AB”。SQL Server 2017您认为,在SQL Server中这似乎过于复杂。。。。然而,您不希望被提醒1NF;-)全部为“AB”还是仅为不同的值AB?您使用的是什么版本的sql server?在较新的函数中,有一些漂亮的函数可能是有用的“AB”。SQL Server 2017您认为,在SQL Server中这似乎过于复杂。。。。然而,您不希望被提醒1NF;-)这很难看,但效率很高,+1从我这边;-)这很难看,但效率很高,+1从我这边;-)我不知道这是否重要,但这种方法不能保证以相同的排序重新创建列表(好吧,我从来没有遇到过任何问题,但可能有一些情况…)。此外,您正在添加一个带有逗号的空格,但这很容易解决…我不知道这是否重要,但这种方法不能保证以相同的排序重新创建列表(嗯,我从未遇到过任何问题,但可能会有情况…)。此外,您正在添加一个带有逗号的空格,但这很容易解决。。。