您现在的位置是:网站首页> 编程资料编程资料

Oracle数据行拆分多行方法示例_oracle_

2023-05-27 583人已围观

简介 Oracle数据行拆分多行方法示例_oracle_

工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比。

单行拆分

如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如:

 select regexp_substr('444.555.666', '[^.]+', 1, level) col from dual connect by level <= regexp_count('444.555.666', '\.') + 1 

输出结果:

 COL ---- 444 555 666 

多行拆分

如果数据表存在多行数据需要拆分,也可以在原表上使用connect+正则的方法:

方法一

 with t as (select '111.222.333' col from dual union all select '444.555.666' col from dual) select regexp_substr(col, '[^.]+', 1, level) from t connect by level <= regexp_count(col, '\.\') + 1 and col = prior col and prior dbms_random.value > 0 

结果:

 --------- 111 222 333 444 555 666 

方法二

使用构造的最大行数值关联原表:

 with t as (select '111.222.333' col from dual union all select '444.555.666' col from dual) select regexp_substr(col, '[^.]+', 1, lv) from t, (select level lv from dual connect by level < 10) b where b.lv <= regexp_count(t.col, '\.\') + 1 

这种方法设置第二个数据集的时候要小于可能的最大值,然后两数据集做关联,在做大数据量拆分的时候,这个数值设置得当,拆分行数相对一致的情况下,效率比方法一直接connect by要高。

方法三

使用table函数:

 with t as (select '111.222.333' col from dual union all select '444.555.666' col from dual) select column_value from t, table(cast(multiset (select regexp_substr(col, '[^.]+', 1, level) dd from dual connect by level <= regexp_count(t.col, '\.\') + 1) as sys.odcivarchar2list)) a 

结果:

 COLUMN_VALUE ------------- 111 222 333 444 555 666 

这个方法输出的列名是固定的,column_value依赖于sys.odcivarchar2list这个类型的输出,该方法对于大数据量的拆分效率比第二个方法好。

方法四

 with t as (select '111.222.333' col from dual union all select '444.555.666' col from dual) select regexp_substr(col, '[^.]+', 1, trim(column_value)) from t, xmltable(concat('1 to ',regexp_count(t.col, '\.\') + 1)) a ; 

注意:大数据量的拆分时,谨慎使用正则的方法去做,可以使用substr+instr的方式替换正则。

如果以上方法的效率仍然不理想,可考虑使用plsql块。

总结

以上就是本文关于Oracle数据行拆分多行方法示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:PLSQL Developer登录的默认密码介绍ORACLE SQL语句优化技术要点解析浅谈oracle rac和分布式数据库的区别oracle 数据库启动阶段分析等。有什么问题可以随时留言,欢迎大家交流讨论。

-六神源码网