我确信标题有点混乱。基本上,我有一个表,该表的列包含“ 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行,并显示以下错误:
子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
但是我确实需要删除所有比赛。救命!
答案 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 + '%';
说;这可能会有不可预测的行为...假设您有一个值catamaran
,并且有逻辑替换单词cat
和tamara
。如果首先替换cat
,则将剩下amaran
,其中不包含tamara
。如果首先替换了tamara
,则剩下的是can
,其中不包含cat
。在这种情况下该怎么办?
以上代码避免了这种情况;通过仅对第一个比赛采取行动...但是,这意味着即使在存在多个有效替换项的情况下(例如替换cat
中的ran
和catamaran
),您仍然不会得到您预期的结果(ama
),但是结果将取决于首先找到cat
或ran
的哪个(相应地给amaran
或catama
)。
您也无法指定此顺序;数据库将仅对首先返回的结果进行操作。
为避免这种情况,最好是按预定义的顺序一次替换一个值。例如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