使用WildCards更新声明

时间:2017-12-10 18:20:46

标签: sql-server-2008 tsql sql-server-2008-r2 sql-update

我有以下更新声明,该声明大部分时间都有效,但在下面的示例中,第2行中未删除文字White

以下语法需要更改哪些内容,以便field2中的文本始终被删除field1中的文本,无论字符串中的文本位置如何?

Declare @Table1 Table (field1 varchar(100), field2 varchar(100))

Insert Into @Table1 (field1, field2) Values
('Blue Green', 'Green'), ('Red White', 'Socks Are White')

UPDATE @Table1
SET field2 = REPLACE(field1,field2,'')
WHERE field1 like '%'+field2+'%';

Select * from @Table1

修改
更新后的预期结果是

'Blue Green', ''
'Red White', 'Socks Are'

忽略field2中的单词Green,因为它存在于field1中,并且从field2中省略单词White,因为它存在于field1中

1 个答案:

答案 0 :(得分:1)

问题是REPLACE功能正在使用完全替换。下面的代码将用“”替换“blue green”的出现。但是“蓝绿色”字符串不会出现在第一个字符串中,因此不会替换任何内容。

REPLACE('Green', 'Blue Green', '') 

对于您的解决方案,首先需要将field1拆分为单词。有关使用函数拆分字符串的信息,请参阅此solution。或者,您可以使用CLR调用.net函数来拆分字符串。

接下来,您可以使用游标遍历整个表,并为@Table中的每条记录为上述函数返回的每条记录运行一次REPLACE函数。

请注意,这将比您最初编写的更新语句慢得多,因为它不使用SQL非常适合的SET逻​​辑,而是一次迭代第一个表记录。