如何查找并移除地址中数字后的ND/RD后缀?
地址序数词后缀(nd/rd)移除方案
针对你需要把类似“200 162nd Street”的地址处理成“200 162 Street”的需求,核心是精准匹配数字后的nd/rd后缀并移除,下面分主流数据库给出具体实现:
MySQL/MariaDB
使用REGEXP_REPLACE函数,通过正则匹配数字+nd/rd的组合,替换为原数字:
SELECT REGEXP_REPLACE('200 162nd Street', '([0-9]+)(nd|rd)', '\\1') AS cleaned_address; -- 输出结果:200 162 Street
注:MySQL里正则替换的反向引用需要用双反斜杠\\1转义。
PostgreSQL
同样用REGEXP_REPLACE,反向引用直接用单反斜杠即可:
SELECT REGEXP_REPLACE('200 162nd Street', '([0-9]+)(nd|rd)', '\1') AS cleaned_address; -- 输出结果:200 162 Street
SQL Server
2016及以上版本(支持正则)
SELECT REGEXP_REPLACE('200 162nd Street', '([0-9]+)(nd|rd)', '$1') AS cleaned_address; -- 输出结果:200 162 Street
旧版本(无正则支持)
用PATINDEX定位后缀位置,再通过STUFF移除:
DECLARE @address VARCHAR(100) = '200 162nd Street'; SELECT CASE WHEN PATINDEX('%[0-9]nd %', @address) > 0 THEN STUFF(@address, PATINDEX('%[0-9]nd %', @address)+1, 2, '') WHEN PATINDEX('%[0-9]rd %', @address) > 0 THEN STUFF(@address, PATINDEX('%[0-9]rd %', @address)+1, 2, '') ELSE @address END AS cleaned_address;
额外说明
- 上述正则模式仅匹配数字紧跟nd/rd的场景,避免误删地址中其他单词包含的nd/rd(比如“Randolph Street”这类不会被影响)。
- 如果需要扩展处理其他序数词后缀(如
st/th),直接在正则匹配项里补充即可,比如写成([0-9]+)(nd|rd|st|th)。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

