如何替换一个确切的字符串

时间:2019-01-29 16:50:12

标签: sql sql-server tsql sql-server-2012

我们正在使用SQL Server 2012 SP2

我正在尝试通过清理我们从外部来源收到的垃圾地址数据来实现一些地址标准化。我遇到一个问题,其中replace函数意外替换了字符串的一部分。

我们有一个使数据正确区分大小写的函数,然后我使用了很多替换函数来“清理”我们的数据。

我在将内容改回大写时遇到问题。

这是一个样本

我正在处理的事情

101 Second Ave Se

这是正在发生的事情

101 SEcond Ave SE

这就是我需要它看起来的方式

101 Second Ave SE

我尝试在replace语句中添加归类,在replace函数的字符串前后添加空格,等等...

我尝试过的示例(带或不带排序规则)

replace(dbo.propercase(address1) COLLATE Latin1_General_CS_AS, ' Se' COLLATE Latin1_General_CS_AS, ' SE')

replace(dbo.propercase(address1) COLLATE Latin1_General_CS_AS, ' Se ' COLLATE Latin1_General_CS_AS, ' SE ')

replace(dbo.propercase(address1) COLLATE Latin1_General_CS_AS, 'Se ' COLLATE Latin1_General_CS_AS, 'SE ')

replace(dbo.propercase(address1) COLLATE Latin1_General_CS_AS, 'Se' COLLATE Latin1_General_CS_AS, 'SE')

它仍然希望用SE替换找到的每个Se。

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

address1 = left(address1, len(address1)-3) + ‘ SE’ where right(address1,3) = ‘ se’

答案 1 :(得分:1)

这是使用patindex函数执行此操作的一种方法。即使在冒犯的字符串后面还有更多单词的情况下,该方法也可以让您替换。

declare @string nvarchar(255) = N'101 Second Ave Se Unit 4'
declare @toFind nvarchar(255) = N'se'
declare @toReplace nvarchar(255) = N'SE'

IF PATINDEX(N'%[^Aa-Zz]'+@toFind+'[^Aa-Zz]%','.'+@string+'.') > 0
SET @string = left(@string,PATINDEX(N'%[^Aa-Zz]'+@toFind+'[^Aa-Zz]%','.'+@string+'.')-1)+@toReplace+right(@string,len(@string)-((PATINDEX(N'%[^Aa-Zz]'+@toFind+'[^Aa-Zz]%','.'+@string+'.')-1)+len(@toReplace)))

select @string

效率不是很高,但是可以。

答案 2 :(得分:0)

听起来这是一次性的手动清理。如果没有一个好的答案,您可以进行两次替换。

继续,将se换成SE

然后将SEcond换成Second进行更正。