Oracle数据行拆分多行的示例分析
小编给大家分享一下Oracle数据行拆分多行的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
单行拆分
如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如:
selectregexp_substr('444.555.666','[^.]+',1,level)colfromdualconnectbylevel<=regexp_count('444.555.666','\.')+1
输出结果:
COL----444555666
多行拆分
如果数据表存在多行数据需要拆分,也可以在原表上使用connect+正则的方法:
方法一
withtas(select'111.222.333'colfromdualunionallselect'444.555.666'colfromdual)selectregexp_substr(col,'[^.]+',1,level)fromtconnectbylevel<=regexp_count(col,'\.\')+1andcol=priorcolandpriordbms_random.value>0
结果:
---------111222333444555666
方法二
使用构造的最大行数值关联原表:
withtas(select'111.222.333'colfromdualunionallselect'444.555.666'colfromdual)selectregexp_substr(col,'[^.]+',1,lv)fromt,(selectlevellvfromdualconnectbylevel<10)bwhereb.lv<=regexp_count(t.col,'\.\')+1
这种方法设置第二个数据集的时候要小于可能的最大值,然后两数据集做关联,在做大数据量拆分的时候,这个数值设置得当,拆分行数相对一致的情况下,效率比方法一直接connect by要高。
方法三
使用table函数:
withtas(select'111.222.333'colfromdualunionallselect'444.555.666'colfromdual)selectcolumn_valuefromt,table(cast(multiset(selectregexp_substr(col,'[^.]+',1,level)ddfromdualconnectbylevel<=regexp_count(t.col,'\.\')+1)assys.odcivarchar2list))a
结果:
COLUMN_VALUE-------------111222333444555666
这个方法输出的列名是固定的,column_value依赖于sys.odcivarchar2list这个类型的输出,该方法对于大数据量的拆分效率比第二个方法好。
方法四
withtas(select'111.222.333'colfromdualunionallselect'444.555.666'colfromdual)selectregexp_substr(col,'[^.]+',1,trim(column_value))fromt,xmltable(concat('1to',regexp_count(t.col,'\.\')+1))a;
注意:大数据量的拆分时,谨慎使用正则的方法去做,可以使用substr+instr的方式替换正则。
如果以上方法的效率仍然不理想,可考虑使用plsql块。
以上是“Oracle数据行拆分多行的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。