Oracle数据行拆分多行方法示例
工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比。
单行拆分
如果表数据只有一行,则可以直接在原表上直接使用connectby+正则的方法,比如:
selectregexp_substr('444.555.666','[^.]+',1,level)col fromdual connectbylevel<=regexp_count('444.555.666','\.')+1
输出结果:
COL ---- 444 555 666
多行拆分
如果数据表存在多行数据需要拆分,也可以在原表上使用connect+正则的方法:
方法一
withtas (select'111.222.333'col fromdual unionall select'444.555.666'col fromdual) selectregexp_substr(col,'[^.]+',1,level) fromt connectbylevel<=regexp_count(col,'\.\')+1 andcol=priorcol andpriordbms_random.value>0
结果:
--------- 111 222 333 444 555 666
方法二
使用构造的最大行数值关联原表:
withtas (select'111.222.333'col fromdual unionall select'444.555.666'col fromdual) selectregexp_substr(col,'[^.]+',1,lv) fromt,(selectlevellvfromdualconnectbylevel<10)b whereb.lv<=regexp_count(t.col,'\.\')+1
这种方法设置第二个数据集的时候要小于可能的最大值,然后两数据集做关联,在做大数据量拆分的时候,这个数值设置得当,拆分行数相对一致的情况下,效率比方法一直接connectby要高。
方法三
使用table函数:
withtas (select'111.222.333'col fromdual unionall select'444.555.666'col fromdual) selectcolumn_value fromt, table(cast(multiset (selectregexp_substr(col,'[^.]+',1,level)dd fromdual connectbylevel<=regexp_count(t.col,'\.\')+1)as sys.odcivarchar2list))a
结果:
COLUMN_VALUE ------------- 111 222 333 444 555 666
这个方法输出的列名是固定的,column_value依赖于sys.odcivarchar2list这个类型的输出,该方法对于大数据量的拆分效率比第二个方法好。
方法四
withtas (select'111.222.333'col fromdual unionall select'444.555.666'col fromdual) selectregexp_substr(col,'[^.]+',1,trim(column_value)) fromt, xmltable(concat('1to',regexp_count(t.col,'\.\')+1))a;
注意:大数据量的拆分时,谨慎使用正则的方法去做,可以使用substr+instr的方式替换正则。
如果以上方法的效率仍然不理想,可考虑使用plsql块。
总结
以上就是本文关于Oracle数据行拆分多行方法示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:PLSQLDeveloper登录的默认密码介绍、ORACLESQL语句优化技术要点解析、浅谈oraclerac和分布式数据库的区别、oracle数据库启动阶段分析等。有什么问题可以随时留言,欢迎大家交流讨论。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。