Oracle PL/SQL按分号拆分Full_address字段为多列求助
Oracle PL/SQL按分号拆分地址字段方案
针对你的需求,这里提供两种可行的拆分方案,适配不支持LEFT/RIGHT和CHARINDEX的Oracle版本:
方法一:正则表达式法(简洁高效)
利用Oracle的REGEXP_SUBSTR函数匹配分号分隔的内容,结合TRIM去除每个字段前后的空格:
SELECT TRIM(REGEXP_SUBSTR(Full_address, '[^;]+', 1, 1)) AS address_part1, TRIM(REGEXP_SUBSTR(Full_address, '[^;]+', 1, 2)) AS address_part2, TRIM(REGEXP_SUBSTR(Full_address, '[^;]+', 1, 3)) AS address_part3, TRIM(REGEXP_SUBSTR(Full_address, '[^;]+', 1, 4)) AS address_part4, TRIM(REGEXP_SUBSTR(Full_address, '[^;]+', 1, 5)) AS address_part5 FROM your_table;
- 说明:
[^;]+表示匹配任意非分号的字符序列;第四个参数1/2/3/4/5分别指定取第1到第5个分隔后的片段;TRIM用于清除分号前后的空格。
方法二:传统字符串函数法(兼容极旧版本)
如果你的Oracle版本不支持正则函数,可使用INSTR和SUBSTR组合实现:
SELECT TRIM(SUBSTR(Full_address, 1, INSTR(Full_address, ';') - 1)) AS address_part1, TRIM(SUBSTR(Full_address, INSTR(Full_address, ';') + 1, INSTR(Full_address, ';', 1, 2) - INSTR(Full_address, ';') - 1)) AS address_part2, TRIM(SUBSTR(Full_address, INSTR(Full_address, ';', 1, 2) + 1, INSTR(Full_address, ';', 1, 3) - INSTR(Full_address, ';', 1, 2) - 1)) AS address_part3, TRIM(SUBSTR(Full_address, INSTR(Full_address, ';', 1, 3) + 1, INSTR(Full_address, ';', 1, 4) - INSTR(Full_address, ';', 1, 3) - 1)) AS address_part4, TRIM(SUBSTR(Full_address, INSTR(Full_address, ';', 1, 4) + 1)) AS address_part5 FROM your_table;
- 说明:
INSTR(Full_address, ';', 1, n)用于定位第n个分号的位置;SUBSTR根据分号位置截取对应片段,最后用TRIM清理空格。
关于你之前尝试语句的问题
你之前的语句存在模式匹配错误或参数顺序错误:
regexp_substr(Full_address,'[^[:print:]]|,/'):匹配的是非打印字符或逗号/斜杠,和分号拆分无关;SUBSTR (t.address_one_line, INSTR('_', Full_address)-10):INSTR参数顺序颠倒(应为INSTR(Full_address, '_')),且逻辑不符合拆分需求;regexp_substr(upper(Full_address), '(^\w+)-', ,, 10, 'i', 10):模式匹配开头的单词加横杠,和分号分隔的逻辑完全不匹配。
内容的提问来源于stack exchange,提问作者user3139937
相关产品推荐
相关产品推荐

