我正在尝试更新查询以更正街道地址缩写。我想纠正像123 Main Cr这样的123 Main Cir。但是,我不希望它弄乱像123 Creek Cir这样的地址,并且我希望它能够抓住123 Main Cr Apt 28.这就是我到目前为止所拥有的。这是使用SQL Server 2008。
UPDATE AddressTable
SET AD = replace(AD, 'Cr', 'Cir')
WHERE right(ad,3) like '% cr%'
提前谢谢。
答案 0 :(得分:0)
试试这个,并相应地更新你的UPDATE语句。我相信你要问的是你要确保用“单词边界”代替:
参考:
测试1:
SELECT REGEXP_REPLACE ( '123 Creek Cr' , '(^|\s)Cr(\s|$)' , ' Cir' ) AS output_txt
FROM dual;
的Test2:
SELECT REGEXP_REPLACE ( '123 Main Cr' , '(^|\s)Cr(\s|$)' , ' Cir' ) AS output_txt
FROM dual;
答案 1 :(得分:0)
听起来你正在寻找standardize addresses,正确的缩写,拼写等等。解析和标准化地址是一个非常复杂的问题。当然,有许多因素会影响地址的形成,而RegEx无法处理所有地址解析,因为地址不是常规的。例如,如果您有此地址:
100 Main St Helena CA
该人的意思是
100 Main Street, Helena, CA?
或者是
100 Main [street], St. Helena, CA?
这显然是一个相当简单的示例,但您可以看到SQL函数如何很难解析用户对地址输入的意图。找出标准化地址的所有因素,变化和规则可能是一项艰巨的任务。因此,我建议您考虑使用专门从事地址标准化的服务。利用这样的服务可以使您的任务变得更加容易。
像SmartyStreets这样的公司经历了所有令人头痛的问题,并且无法确定地址的格式,并将返回标准化的地址输出,以便您更新数据库。 SmartyStreets专注于美国邮政地址,但也有其他公司也在做国际地址。以下是一些确实涉及标准化的公司:
这些和许多其他服务可以更快地处理清理地址数据的任务,而不是考虑到标准化地址所涉及的所有因素和变化。
答案 2 :(得分:0)
以下查询可能适合您:
UPDATE AddressTable
SET AD =
(CASE SUBSTRING(AD, LEN(AD)-1, 2)
WHEN 'Cr' THEN replace(LEFT(AD, LEN(AD)-2) + 'Cir', ' Cr ', ' Cir ')
ELSE replace(AD, ' Cr ', ' Cir ')
END)
WHERE AD like '% Cr'
OR AD like '% Cr %'
答案 3 :(得分:0)
您可以在字符串后附加一个空格并按以下方式过滤结果:
WHERE ad + ' ' LIKE '% Cr %'
同样,您可以在字符串中附加一个空格,并将所有' Cr '
替换为' Cir '
:
REPLACE(ad + ' ', ' Cr ', ' Cir ')
他们只修剪尾随空格。所以,最终结果如下:
UPDATE AddressTable
SET AD = RTRIM(REPLACE(AD + ' ', ' Cr ', ' Cir '))
WHERE AD + ' ' LIKE '% Cr %'
;