假设我有一个逗号分隔的字符串(我知道,最好对其进行规范化,但这不是一个选项)并且记录如下所示(注意每个逗号后面的空格):
11, 15, 17, 23
15, 34, 46, 69
15
27, 41, 29, 15
我需要从所有包含“15”的值中删除它,无论位置如何。正如您所看到的,数字可以是唯一的值,位于字符串的开头、中间、末尾。完成后,我希望我的记录如下所示:
11, 17, 23
34, 46, 69
27, 41, 29
我知道我可以创建 3-4 个单独的查询来处理所有不同的情况,但我真的希望有 1 个查询。
TIA, -TS。
最佳答案
如果您绝对确定无法修复这个糟糕的数据库设计,您可以使用 CTE 执行以下操作: , REPLACE
,和 STUFF
首先,创建并填充示例表(请在您以后的问题中保存此步骤):
DECLARE @T AS TABLE
(
BadColumn varchar(100)
)
INSERT INTO @T VALUES
('11, 15, 17, 23'),
('15, 34, 46, 69'),
('15'),
('27, 41, 29, 15')
然后,CTE:注意我在实际值之前和之后添加了分隔符。
;WITH CTE AS
(
SELECT REPLACE(', '+ BadColumn +', ', ', 15, ', ', ') As Without15
FROM @T
)
查询:(我使用 select 来显示结果,但您也可以使用它来更新)
SELECT ISNULL(
STUFF(
STUFF(Without15, 1, 2, ''),
LEN(Without15)-2, 2, '')
, '') As StillBadButWithout15
FROM CTE
结果:
StillBadButWithout15
11, 17, 23
34, 46, 69
27, 41, 29
更新
您可以将原始列添加到cte并直接更新cte:
;WITH CTE AS
(
SELECT BadColumn, REPLACE(', '+ BadColumn +', ', ', 15, ', ', ') As Without15
FROM @T
)
UPDATE CTE
SET BadColumn = ISNULL(
STUFF(
STUFF(Without15, 1, 2, ''),
LEN(Without15)-2, 2, '')
, '')
关于sql - 从逗号分隔字符串 SQL Server 中删除值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48193162/