基于全字的SQL搜索和更新

时间:2013-01-09 21:09:32

标签: sql sql-server sql-server-2005 search

我想在我的某个列中找到一个单词,并将其替换为一些自定义文本。我有下表:

DECLARE @Table TABLE ( [Names] VARCHAR(100) )

INSERT INTO @Table
SELECT 'This is test module for testing' UNION
SELECT 'This is test module for to fork' UNION
SELECT 'This is test module for testing mod' UNION
SELECT 'This is testing' UNION
SELECT 'This is module'

我在下面解释我的确切需要:

当用户搜索文本“test”并想要将其替换为“customtext”时,应选择以下行:

This is test module for testing
This is test module for to fork
This is test module for testing mod

在用“customtext”替换“test”(全字)之后,更新的记录应为:

This is customtext module for testing
This is customtext module for to fork
This is customtext module for testing mod

您可能已经注意到我需要在完整的单词上进行搜索而不是在部分文本上进行搜索,例如在上面的案例中包含部分文本“test”的“测试”。

解释相同要求的另一个例子:

当用户搜索“mod”并希望将其替换为“customtext”时,应选择以下行:

This is test module for testing mod

在用“customtext”替换后,更新的记录应为:

This is test module for testing customtext

由于“mod”是完整的单词,因此它被替换的单词而不是包含部分文本“mod”的单词“module”。

4 个答案:

答案 0 :(得分:0)

使用like:使用我自己的样本数据的某种模式。首先,您可以为要替换的单词以及要搜索的单词添加两个变量

* SQLFIDDLE DEMO

样本数据表:

VNAME
smp tests farms
hellocoles
hell testing str
Anvil test NSW

查询:

select vname from 
vendor 
where '.' + vname + '.' 
LIKE '%[^a-z]test[^a-z]%'
;

结果:

VNAME
Anvil test NSW

以下是更新查询:

update vendor
set vname = replace(vname,'test','newword')
from vendor 
where '.' + vname + '.' 
LIKE '%[^a-z]test[^a-z]%'
;

* Before and after update query DEMO

答案 1 :(得分:0)

UPDATE TABLE_NAME
SET Column_NameA = replace(Column_NameA, 'test', 'customtext')
WHERE  (Column_NameA LIKE ('%' + ' ' + 'test' + ' ' + '%'))

答案 2 :(得分:0)

我的解决方案;

DECLARE @Find VARCHAR(50) = 'test',
        @Replace VARCHAR(50) = 'customtext'
DECLARE @Table TABLE ( [Names] VARCHAR(100) )

INSERT INTO @Table
SELECT 'This is test module for testing' UNION
SELECT 'This is test module for to fork' UNION
SELECT 'This is test module for testing mod' UNION
SELECT 'This is testing' UNION
SELECT 'This is module'

SELECT *
    ,REPLACE(' ' + Names + ' ', ' ' + @Find + ' ', ' ' + @Replace + ' ')

FROM @Table

答案 3 :(得分:-3)

你能使用像(^ | \ s)文本($ | \ s)这样的简单正则表达式,还是我不明白这个问题?