SQL Server:更新以匹配并仅替换确切的单词

时间:2018-06-21 17:37:35

标签: sql-server replace sql-update exact-match

我想匹配一个确切的单词,然后用另一个单词替换它。

这是我正在使用的SQL Server查询:

UPDATE BODYCONTENT 
SET BODY = CAST(REPLACE(CAST(BODY AS NVARCHAR(MAX)), 'Test' , 'prod') AS NTEXT) 
WHERE BODY COLLATE Latin1_General_CI_AS LIKE '%Test%' COLLATE Latin1_General_CI_AS;

此查询的作用:

'Test','test','TEST'更新为'prod'-这是预期的。

'Test2','TestTest','Fastest'更新为'prod'-我想避免这种情况。

请帮助。

我尝试过但没有用的其他查询:

UPDATE BODYCONTENT 
SET BODY = CAST(REPLACE(CAST(BODY AS NVARCHAR(MAX)), 'Test' , 'prod') AS NTEXT) 
WHERE BODY COLLATE Latin1_General_CI_AS LIKE '%[^A-Za-z0-9]Test[^A-Za-z0-9]%' COLLATE Latin1_General_CI_AS;

当我使用以下查询为“测试”进行选择时:

SELECT * 
FROM dbo.BODYCONTENT 
WHERE CONVERT(NVARCHAR(MAX), BODY) = N'Test';

它没有返回任何东西。但是我可以使用以下查询获得结果:

  SELECT BODY 
  FROM dbo.BODYCONTENT 
  WHERE BODY LIKE '%Test%';

  SELECT BODY 
  FROM dbo.BODYCONTENT 
  WHERE BODY COLLATE Latin1_General_CI_AS like '%TEST%' COLLATE Latin1_General_CI_AS;

这是列值:

Test testtest Test1 Test TEST

预期结果:

prod testtest Test1 prod prod

当前结果:

prod prodprod prod1 prod prod

1 个答案:

答案 0 :(得分:2)

我的印象是test的所有不同版本都在同一行值内,这就是为什么您指出建议的like 'test'无法正常工作的原因。

基于此,以下内容很难看但可以满足您的要求:

declare @t table(s ntext);
insert into @t values('Test testtest Test1 Test TEST');

select s as Original
        ,ltrim(rtrim(replace(
                            replace(
                                    replace(N' ' + cast(s as nvarchar(max)) + N' '  -- Add a single space before and after value,
                                            ,' ','<>'                               -- then replace all spaces with any two characters.
                                            )
                                    ,'>test<','>prod<'      -- Use these two characters to identify single instances of 'test'
                                    )
                            ,'<>',' '       -- Then replace the delimiting characters with spaces and trim the value.
                            )
                    )
            ) as Updated
from @t;

输出:

+-------------------------------+-------------------------------+
|           Original            |            Updated            |
+-------------------------------+-------------------------------+
| Test testtest Test1 Test TEST | prod testtest Test1 prod prod |
+-------------------------------+-------------------------------+

使用<>代替空格是由于SQL Server的默认行为,即忽略字符串比较中的尾随空格。这些可以是任何两个字符,但我觉得它们在美学上令人愉悦。