• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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 数据库启动阶段分析等。有什么问题可以随时留言,欢迎大家交流讨论。

    您可能感兴趣的文章:
    • Oracle以逗号分隔的字符串拆分为多行数据实例详解
    上一篇:PLSQL Developer登录的默认密码介绍
    下一篇:oracle横向纵向求和代码实例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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