【问题标题】:How to replace an exact string如何替换确切的字符串
【发布时间】:2019-01-29 16:50:12
【问题描述】:

我们使用的是 SQL Server 2012 SP2

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

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

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

这是一个示例

我正在处理的事情

101 Second Ave Se

这是发生了什么

101 SEcond Ave SE

这就是我需要的样子

101 Second Ave 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 ')

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

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

有没有更好的方法来做到这一点?

【问题讨论】:

  • 不存在 Second 和 SE 不在同一模式中的模式。使用 sql server 格式化字符串是为工作选择了错误的工具。使用适当的正则表达式在表示层中执行此操作。
  • 我能想到的在 sql 中执行此操作的唯一方法是使用空格作为分隔符将地址解析为字符串。然后在表格中有一个预定义的替换列表,或者将 LEN
  • 这个问题太难了,以至于有供应商把它作为一种服务来做。包括美国邮政总局。找到可以标准化地址的服务要容易得多。

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


【解决方案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

它不会很有效,但它确实有效。

【讨论】:

  • 这个成功了。 SE 不仅出现在字符串的末尾,而且还解决了异常。谢谢
【解决方案2】:
address1 = left(address1, len(address1)-3) + ‘ SE’ where right(address1,3) = ‘ se’

【讨论】:

  • 请不要忘记接受您的回答(使用左边的勾号)
  • 不幸的是 SE 可以出现在字符串中的任何位置,而这个只检查它是否出现在末尾。不过感谢您的贡献。
【解决方案3】:

听起来这是一次性手动清理。在没有优雅答案的情况下,您可以进行两次替换。

继续将se 替换为SE

然后将SEcond 换成Second 以更正它。

【讨论】:

  • 我希望这是一次性的。除了替换“Second”之外,还有更多变体,我们还有一堆包含“SE”的随机单词。我可能为另一个部门做的比我需要做的多,但我不想处理这个比我需要的更多的事情:)
猜你喜欢
  • 2013-08-07
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多