Oracle数据行拆分多行
2016-05-24 00:00
316 查看
单行拆分
如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如:select regexp_substr('444.555.666', '[^.]+', 1, level) col
from dual
connect by level <= regexp_count('444.555.666', '\.') + 1
输出结果:
多行拆分
如果数据表存在多行数据需要拆分,也可以在原表上使用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
结果:
方法二、使用构造的最大行数值关联原表:
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依赖于sys.odcivarchar2list这个类型的输出,该方法对于大数据量的拆分效率比第二个方法好。
另外需注意,大数据量的拆分时,谨慎使用正则的方法去做,可以使用substr+instr的方式替换正则。
如果以上方法的效率仍然不理想,可考虑使用plsql块。
相关文章推荐
- oracle中in和exists的区别
- Oracle学习笔记七 锁
- RedHat6.6 安装 oracle11gR2教程
- SQL Server数据类型与Oracle数据类型的对应关系
- 如何卸载Oracle 10g
- oracle创建和管理表_数据处理_约束
- Oracle的存储过程编程总结
- azure云上 在线将oracle单实例扩展成oracle dataguard高可用集群的详细过程
- linux 下面安装oracle
- oracle导入csv文本文件到vertica
- oracle 高级分组
- Oracle 存储过程中的循环语句写法
- Oracle 游标 与 存储过程
- Oracle存储过程中游标For循环使用
- PL/SQL如何调试Oracle存储过程
- OCP(02).安装Oracle11g
- OCP(01).在linux下安装Oracle-虚拟机的安装
- oracle系统包——dbms_random用法及order by 小结(转)
- oracle 分组后取每组第一条数据
- oracle添加表,字段备注