MYSQL地址解析方案:如何拆分地址中的门牌号与街道名称
MySQL地址拆分为门牌号和街道实现方案
前置说明
本方案适配门牌号为地址开头连续字符的欧美式地址格式,可覆盖绝大多数常规场景,特殊格式可基于下方逻辑调整规则。
核心逻辑
- 提取地址开头的连续数字(或带字母的门牌号字符)作为Line1(门牌号)
- 去除开头门牌号及后续空格后剩余的内容作为Line2(街道名称)
- 地址无数字的场景下Line1返回空值,完整地址返回为Line2
具体实现
1. MySQL 8.0+ 版本(推荐,内置正则函数支持)
直接用系统自带的REGEXP_SUBSTR和REGEXP_REPLACE实现,性能最优:
SELECT -- 提取开头连续数字作为门牌号,无数字则返回空字符串 IFNULL(TRIM(REGEXP_SUBSTR(full_address, '^[0-9]+')), '') AS Line1, -- 移除开头门牌号和后续空格,剩余部分为街道 TRIM(REGEXP_REPLACE(full_address, '^[0-9]+\\s*', '')) AS Line2 FROM your_address_table;
如果你的场景需要适配带字母的门牌号(例如123A ABC Street),把正则修改为^[0-9A-Za-z]+即可。
2. MySQL 5.x 版本(无内置正则提取函数)
可通过自定义函数实现,灵活性更高:
-- 自定义门牌号提取函数 DELIMITER // CREATE FUNCTION GET_HOUSE_NUMBER(address VARCHAR(255)) RETURNS VARCHAR(50) DETERMINISTIC BEGIN DECLARE i INT DEFAULT 1; DECLARE house_num VARCHAR(50) DEFAULT ''; IF address IS NULL OR address = '' THEN RETURN ''; END IF; -- 遍历开头的连续数字字符 WHILE i <= LENGTH(address) AND SUBSTRING(address, i, 1) REGEXP '[0-9]' DO SET house_num = CONCAT(house_num, SUBSTRING(address, i, 1)); SET i = i + 1; END WHILE; RETURN house_num; END // DELIMITER ;
调用函数实现拆分:
SELECT GET_HOUSE_NUMBER(full_address) AS Line1, TRIM(SUBSTRING(full_address, LENGTH(GET_HOUSE_NUMBER(full_address)) + 1)) AS Line2 FROM your_address_table;
边界场景适配建议
- 如遇到PO BOX、部队地址等特殊格式,可新增
CASE WHEN分支单独处理匹配规则 - 如果你的业务场景中地址格式为门牌号后置(例如国内地址),可调整正则匹配末尾的数字段作为门牌号即可
内容的提问来源于stack exchange,提问作者Carl L.
相关产品推荐
相关产品推荐

