You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL清理地址字段:移除多余的城市、州和邮政编码

问题描述

我有一张包含address1、city、state、postal_code字段的表,部分address1字段中额外包含了城市、州和邮政编码(以逗号、空格或两者组合分隔)。示例:

Address1: 9999 western Rd, Los Angeles, CA, 90001
City: Los Angeles
State: CA
Postal: 90001
期望处理后Address1为: 9999 western Rd

我尝试了以下SQL语句修复地址(为简化假设所有字段非空,实际系统中无州的国家该字段为空或与国家名相同):

SELECT LEFT(address1, PATINDEX('%[, ]'+city+'%', billingAddress) - 1)
FROM addresses
WHERE address1 like '%[, ]'+city+'%'+state+'%'+postal_code+'%'
    AND PATINDEX('%[, ]'+City+'%', address1) < 12

但存在问题:部分街道名称包含城市名,例如地址为9999 KIRKLAND WAY、城市为KIRKLAND时,执行该语句后街道名仅剩9999。请问如何用SQL解决此问题?


解决方案

核心思路是从地址字符串的末尾反向匹配完整的城市-州-邮编组合,而非从开头定位城市名,以此避免街道名包含城市名时的误截断问题。

方法1:精准匹配末尾的地址后缀(适配SQL Server)

针对逗号+空格、纯空格两种常见分隔方式,构造完整后缀模式,找到其起始位置后截取前方内容:

SELECT 
    CASE 
        -- 匹配逗号+空格分隔的后缀
        WHEN address1 LIKE '%' + city + ', ' + state + ', ' + postal_code
        THEN LEFT(address1, CHARINDEX(city + ', ' + state + ', ' + postal_code, address1) - 2)
        -- 匹配纯空格分隔的后缀
        WHEN address1 LIKE '%' + city + ' ' + state + ' ' + postal_code
        THEN LEFT(address1, CHARINDEX(city + ' ' + state + ' ' + postal_code, address1) - 1)
        -- 无匹配则保留原地址
        ELSE address1
    END AS cleaned_address1
FROM addresses
WHERE address1 LIKE '%' + city + '%' + state + '%' + postal_code + '%'

可根据实际数据的分隔规则,补充更多分隔符的匹配分支。

方法2:基于长度的反向截断(通用适配)

若分隔符不固定,可先计算城市+州+邮编的总长度,验证地址末尾包含该组合后,直接从末尾截断:

SELECT 
    LEFT(address1, LEN(address1) - LEN(city + state + postal_code) - 4) AS cleaned_address1
    -- 减4是预留分隔符的冗余长度(如", , "这类多分隔符场景,可根据实际调整)
FROM addresses
WHERE 
    RIGHT(address1, LEN(city + state + postal_code) + 4) LIKE '%' + city + '%' + state + '%' + postal_code + '%'

方法3:单词边界匹配(避免部分匹配)

如果你的SQL支持正则风格的单词边界(如SQL Server的[^a-zA-Z0-9]匹配非字母数字字符),可以通过限定城市名是独立单词来避免误匹配:

SELECT 
    LEFT(address1, PATINDEX('%[^a-zA-Z0-9]' + city + '[^a-zA-Z0-9]' + state + '[^a-zA-Z0-9]' + postal_code + '%', address1) - 1)
FROM addresses
WHERE 
    address1 LIKE '%[^a-zA-Z0-9]' + city + '[^a-zA-Z0-9]' + state + '[^a-zA-Z0-9]' + postal_code + '%'

这种方式能确保匹配到的城市名是独立的地址段,而非街道名称的一部分。


内容的提问来源于stack exchange,提问作者shano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:42:28