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
相关产品推荐
相关产品推荐

