首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从逗号分隔的字符串Server中删除值

从逗号分隔的字符串Server中删除值
EN

Stack Overflow用户
提问于 2018-01-10 17:40:37
回答 4查看 7.8K关注 0票数 2

假设我有一个逗号分隔字符串(我知道,规范它更好,但它不是一个选项),记录看起来如下(注意每个逗号后面的空格):

代码语言:javascript
运行
复制
11, 15, 17, 23
15, 34, 46, 69
15
27, 41, 29, 15

我需要从所有的值中删除“15”,不管位置如何。正如您所看到的,数字可以是字符串开头、中间和末尾的唯一值。在我做完之后,我希望我的记录看起来像这样:

代码语言:javascript
运行
复制
11, 17, 23
34, 46, 69

27, 41, 29

我知道我可以创建3-4个单独的查询来处理所有不同的情况,但是我真的希望有一个查询。

TIA,-TS.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-10 17:56:57

--如果您完全确定不可能修复这个糟糕的数据库设计,那么可以使用CTEREPLACESTUFF来做一些事情

首先,创建并填充示例表(--请在今后的问题中保存此步骤):

代码语言:javascript
运行
复制
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:Note --在实际值之前和之后添加分隔符。

代码语言:javascript
运行
复制
;WITH CTE AS
(
    SELECT REPLACE(', '+ BadColumn +', ', ', 15, ', ', ') As Without15
    FROM @T 
)

查询:(我使用select显示结果,但也可以使用它来更新)

代码语言:javascript
运行
复制
SELECT ISNULL(
            STUFF(
                STUFF(Without15, 1, 2, ''), 
                LEN(Without15)-2, 2, '')
        , '') As StillBadButWithout15
FROM CTE

结果:

代码语言:javascript
运行
复制
StillBadButWithout15
11, 17, 23
34, 46, 69

27, 41, 29

在rextester上看一个现场演示。

更新

您可以将原始列添加到cte中,只需直接更新cte:

代码语言:javascript
运行
复制
;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, '')
                , '') 

这是这个的现场演示。

票数 4
EN

Stack Overflow用户

发布于 2021-04-22 15:37:29

如果使用的是SQL2017,则可以使用STRING_AGG函数:

声明@valueToRemove varchar(2) = '15‘

声明@T为表(id int非空标识,BadColumn varchar(100))

插入@T值('11,15,17,23,150'),('15,34,46,69'),(' 15'),('27,41,29,15‘)

与结果as (选择id作为orgId,STRING_AGG(result.res,',')从newVal (选择id,值作为res从@T交叉应用string_split(BadColumn,','),其中trim(值) != @valueToRemove )结果组按id)

更新@T集BadColumn = newVal从其中id = orgId的结果

update @t set BadColumn = '‘其中trim(BadColumn) = @valueToRemove -如果更新是特定于id的,则不需要这个

从@T中选择*

票数 1
EN

Stack Overflow用户

发布于 2018-01-10 18:59:07

与Zohar发布的类似-我有:

代码语言:javascript
运行
复制
select BadColumn, GoodColumn = 
  case
    when BadColumn like '15,%'   then substring(BadColumn,4,8000) 
    when BadColumn like '%,15,%' then replace(BadColumn,',15','')
    when badColumn like '%,15'   then substring(BadColumn,1,datalength(badColumn)-3)
    when badColumn = '15' then ''
   else BadColumn
end
from (select BadColumn=rtrim(ltrim(replace(badColumn,' ',''))) from @t) map;

拆分器在这方面是过分的,但是这个解决方案看起来是什么样子的:

代码语言:javascript
运行
复制
with cleanT as (select BadColumn = replace(badColumn,' ','') from @T)
select t.badColumn , cleanString = isnull(stuff(stringAgg.item,1,1,''),'')
from cleanT t
cross apply
(
  select ','+[value]
  from cleanT tx
  cross apply string_split(t.BadColumn,',') 
  where t.BadColumn = tx.BadColumn
  and [value] <> '15'
  for xml path('')
) stringAgg(item);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48193162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档