首页 / 数据库 / MySQL / Oracle数据行拆分多行
工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比。
单行拆分
如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如:select regexp_substr("444.555.666", "[^.]+", 1, level) colfrom dualconnect by level <= regexp_count("444.555.666", ".") + 1输出结果:多行拆分
如果数据表存在多行数据需要拆分,也可以在原表上使用connect+正则的方法:方法一、with t as(select "111.222.333" colfrom dualunion allselect "444.555.666" colfrom dual)select regexp_substr(col, "[^.]+", 1, level)from tconnect by level <= regexp_count(col, ".") + 1and col = prior coland prior dbms_random.value > 0结果:方法二、使用构造的最大行数值关联原表:with t as(select "111.222.333" colfrom dualunion allselect "444.555.666" colfrom dual)select regexp_substr(col, "[^.]+", 1, lv)from t, (select level lv from dual connect by level < 10) bwhere b.lv <= regexp_count(t.col, ".") + 1这种方法设置第二个数据集的时候要小于可能的最大值,然后两数据集做关联,在做大数据量拆分的时候,这个数值设置得当,拆分行数相对一致的情况下,效率比方法一直接connect by要高。方法三、使用table函数:with t as(select "111.222.333" colfrom dualunion allselect "444.555.666" colfrom dual)select column_valuefrom t,table(cast(multiset(select regexp_substr(col, "[^.]+", 1, level) ddfrom dualconnect by level <= regexp_count(t.col, ".") + 1) as sys.odcivarchar2list)) a结果:这个方法输出的列名是固定的,column_value依赖于sys.odcivarchar2list这个类型的输出,该方法对于大数据量的拆分效率比第二个方法好。另外需注意,大数据量的拆分时,谨慎使用正则的方法去做,可以使用substr+instr的方式替换正则。如果以上方法的效率仍然不理想,可考虑使用plsql块。更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址