我想匹配一个确切的单词,然后用另一个单词替换它。
这是我正在使用的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
答案 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的默认行为,即忽略字符串比较中的尾随空格。这些可以是任何两个字符,但我觉得它们在美学上令人愉悦。