【发布时间】: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