SQL Server:从另一个列表的字符串中删除列表项
我相信这个标题有点让人困惑。基本上,我有一个表,它有一列包含像“xx 123 Rg 43”这样的结构,还有一个包含像“Rg”这样的信息。。如果表2列中的一个条目包含在表1中的字符串中,那么我只需要删除该条目。。给我们留下“xx 123 43” 目前我正在使用:SQL Server:从另一个列表的字符串中删除列表项,sql,sql-server,Sql,Sql Server,我相信这个标题有点让人困惑。基本上,我有一个表,它有一列包含像“xx 123 Rg 43”这样的结构,还有一个包含像“Rg”这样的信息。。如果表2列中的一个条目包含在表1中的字符串中,那么我只需要删除该条目。。给我们留下“xx 123 43” 目前我正在使用: update [Table1] set [Col1] = case when (select * from [Table2] where charindex('
update [Table1]
set [Col1] = case
when (select * from [Table2]
where charindex(' ' + [Col2] + ' ', [Col1]) > 0) is not null
then replace([Col1], (select * from [Table2]
where charindex(' ' + [Col2] + ' ', [Col1]) > 0), '')
else [Col1]
end
这很好,但是如果这个查询
select *
from [Table2]
where charindex(' ' + [Col2] + ' ', [Col1]) > 0
返回包含此错误的多行:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时
但我需要把每根火柴都去掉。救命啊 您似乎想要:
update t1
set col1 = (case when exists (select 1
from t2
where charindex(t2.col2, t1.col1) > 0)
)
then stuff
else t1.col1
end)
你试过这样的东西吗
update actual
set column1 = replace(column1, valueToReplace, '')
from TableWithActualData actual
inner join TableWithValuesToFind find
on actual.column1 like '%' + find.valueToReplace + '%';
看
也就是说;这可能会有不可预测的行为。。。假设您有一个值双体船
,并且您有逻辑来替换单词cat
和tamara
。如果先更换cat
,剩下的是amaran
,它不包含tamara
。如果您先更换了tamara
,则剩下的是can
,它不包含cat
。在这种情况下,行为应该是什么
上面的代码某种程度上避免了这种情况;只在第一场比赛中表演。。。然而,这意味着即使在存在多个有效替换的情况下(例如,在双体船中替换cat
和ran
),您仍然无法获得预期的结果(ama
),但结果将取决于最先找到的cat
或ran
)(相应地给出amaran
或catama
)
您也无法指定此顺序;数据库将只对首先返回的结果进行操作
为了避免这种情况,最好按照预定义的顺序一次替换一个值……例如
基本问题在于数据结构。不要使用字符串存储项目列表。SQL有一个很好的列表数据结构。它被称为表。
declare @valueToReplace nvarchar(256)
declare replaceValueCuror cursor for
select valueToReplace
from TableWithValuesToFind
order by priority
open replaceValueCuror
fetch next from replaceValueCuror
into @valueToReplace
while @@fetch_status = 0
begin
update TableWithActualData
set column1 = replace(column1, @valueToReplace, '')
where column1 like '%' + @valueToReplace + '%'
fetch next from replaceValueCuror
into @valueToReplace
end
close replaceValueCuror
deallocate replaceValueCuror