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

Oracle SQL如何按CHAR(30)分隔符将ADDRESS字段拆分为最多5列

Oracle按CHAR(30)分隔符拆分地址为5列的实现方案

通用推荐方案(兼容Oracle 11g及以上所有版本)

直接用REGEXP_SUBSTR函数实现,不需要创建额外函数、存储过程,单条查询即可出结果,能兼容空地址段、连续分隔符的场景,不会出现列错位问题。
可直接复用的SQL代码如下:

SELECT
  ID,
  TRIM(REGEXP_SUBSTR(ADDRESS, '([^'||CHAR(30)||']*)('||CHAR(30)||'|$)', 1, 1, NULL, 1)) AS ADDRESS1,
  TRIM(REGEXP_SUBSTR(ADDRESS, '([^'||CHAR(30)||']*)('||CHAR(30)||'|$)', 1, 2, NULL, 1)) AS ADDRESS2,
  TRIM(REGEXP_SUBSTR(ADDRESS, '([^'||CHAR(30)||']*)('||CHAR(30)||'|$)', 1, 3, NULL, 1)) AS ADDRESS3,
  TRIM(REGEXP_SUBSTR(ADDRESS, '([^'||CHAR(30)||']*)('||CHAR(30)||'|$)', 1, 4, NULL, 1)) AS ADDRESS4,
  TRIM(REGEXP_SUBSTR(ADDRESS, '([^'||CHAR(30)||']*)('||CHAR(30)||'|$)', 1, 5, NULL, 1)) AS ADDRESS5
FROM 你的业务表名; -- 替换成实际业务表名即可

写法说明

  • 不使用网上常见的'[^'||CHAR(30)||']+'正则规则:这种写法遇到连续两个CHAR(30)分隔符(即存在空地址段)时会跳过空值,导致后续列错位,上述正则写法可以完美兼容空段场景,拆分位置准确。
  • 外层的TRIM()函数用于去除拆分后地址段首尾的冗余空格,如果业务要求保留地址首尾空格,直接去掉TRIM()包裹即可。
  • 地址拆分后不足5段时,后续的ADDRESS列自动返回空值;超过5段的内容自动截断,完全匹配最多拆5列的需求。
  • 样例数据里因为CHAR(30)是不可见的ASCII控制字符,所以显示时地址段连在一起,实际执行脚本时会正确识别分隔符,输出结果和给出的期望格式完全一致。

高版本Oracle简化写法(12c R2及以上可用)

如果数据库版本是12c R2或更高,可以用JSON函数实现,性能比正则写法更好,代码更简洁:

SELECT
  ID,
  JSON_VALUE(addr_arr, '$[0]') AS ADDRESS1,
  JSON_VALUE(addr_arr, '$[1]') AS ADDRESS2,
  JSON_VALUE(addr_arr, '$[2]') AS ADDRESS3,
  JSON_VALUE(addr_arr, '$[3]') AS ADDRESS4,
  JSON_VALUE(addr_arr, '$[4]') AS ADDRESS5
FROM (
  SELECT 
    ID,
    '["' || REPLACE(ADDRESS, CHAR(30), '","') || '"]' AS addr_arr
  FROM 你的业务表名
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:24:24