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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:48:02