sql - 从逗号分隔字符串 SQL Server 中删除值

标签 sql sql-server t-sql

假设我有一个逗号分隔的字符串(我知道,最好对其进行规范化,但这不是一个选项)并且记录如下所示(注意每个逗号后面的空格):

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

See a live demo on rextester.

更新

您可以将原始列添加到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, '')
                , '') 

Here is the live demo for this.

关于sql - 从逗号分隔字符串 SQL Server 中删除值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48193162/

相关文章:

sql-server - 对所有值进行分组和乘法?

sql-server - 如何以所有者和唯一用户的身份修复 Azure SQL Server 中的数据库权限?

php - 如何在 mySQL 的 REGEXP 中添加 PHP 变量

sql - 如何根据多个字段选择不同的行

sql - 如何使用 Coalesce 和 Max 提取不为空的最大值列

mysql - 编写查询来计算平均收入但错误地得到一组?

sql - 如何递归获取逗号分隔的 CategoryId?

sql-server - 如何在 SQL 中随机化外键值?

c# - 在 SQL Server 中解析日期时出现 SqlDateTime 溢出错误

sql-server - 存储过程不返回行 - 需要一些调试技巧