假设我有一个逗号分隔字符串(我知道,规范它更好,但它不是一个选项),记录看起来如下(注意每个逗号后面的空格):
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个单独的查询来处理所有不同的情况,但是我真的希望有一个查询。
TIA,-TS.
发布于 2018-01-10 17:56:57
--如果您完全确定不可能修复这个糟糕的数据库设计,那么可以使用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:Note --在实际值之前和之后添加分隔符。
;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
在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, '')
, '')
这是这个的现场演示。
发布于 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中选择*
发布于 2018-01-10 18:59:07
与Zohar发布的类似-我有:
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;
拆分器在这方面是过分的,但是这个解决方案看起来是什么样子的:
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);
https://stackoverflow.com/questions/48193162
复制相似问题