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

时间:2018-07-27 13:05:26

标签: sql sql-server

我确信标题有点混乱。基本上,我有一个表,该表的列包含“ 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

返回超过1行,并显示以下错误:

  

子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

但是我确实需要删除所有比赛。救命!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您尝试过这样的事情吗?

update actual
set column1 = replace(column1, valueToReplace, '')
from TableWithActualData actual
inner join TableWithValuesToFind find
on actual.column1 like '%' + find.valueToReplace + '%';

请参见SQL Fiddle Example

说;这可能会有不可预测的行为...假设您有一个值catamaran,并且有逻辑替换单词cattamara。如果首先替换cat,则将剩下amaran,其中不包含tamara。如果首先替换了tamara,则剩下的是can,其中不包含cat。在这种情况下该怎么办?

以上代码避免了这种情况;通过仅对第一个比赛采取行动...但是,这意味着即使在存在多个有效替换项的情况下(例如替换cat中的rancatamaran),您仍然不会得到您预期的结果(ama),但是结果将取决于首先找到catran的哪个(相应地给amarancatama)。

您也无法指定此顺序;数据库将仅对首先返回的结果进行操作。

为避免这种情况,最好是按预定义的顺序一次替换一个值。例如SQL Fiddle

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