SQL Server:从另一个列表的字符串中删除列表项

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('

我相信这个标题有点让人困惑。基本上,我有一个表,它有一列包含像“xx 123 Rg 43”这样的结构,还有一个包含像“Rg”这样的信息。。如果表2列中的一个条目包含在表1中的字符串中,那么我只需要删除该条目。。给我们留下“xx 123 43”

目前我正在使用:

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