当前位置: 首页 > 编程笔记 >

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

左丘烨烁
2023-03-14
本文向大家介绍Oracle数据行拆分多行方法示例,包括了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 数据库启动阶段分析等。有什么问题可以随时留言,欢迎大家交流讨论。

 类似资料:
  • 我有一个表,其中包括一个CLOB字段,该字段的值由逗号分隔的行组成。在输出中,我希望每行都有一行,这些行以一个特定的值开始。我还想从性能上提取一些逗号分隔的值。 输入表(3行): 'm'将源字符串视为多行。Oracle将插入符号(^)和美元符号($)分别解释为源字符串中任意行的开始和结束 这些有什么问题吗?或者更好的是,没有Regex还有更好的性能吗?

  • 问题内容: 我已使用从IMDB收集信息并将其传输到MYSQL数据库的应用程序导入了一些数据。 似乎这些字段尚未标准化,并且在1个字段中包含许多值 例如: 有没有办法将这些值分开,然后将它们插入到另一个表中,而不重复呢? 我进行了一些谷歌搜索,发现我应该使用PHP处理此数据。但是我一点都不了解PHP。 无论如何,仅使用MYSQL即可转换此​​数据? 问题答案: 您可以使用存储过程,该过程使用游标来解

  • 需要帮助以下从测试中选择col1、col2、split(col3); 任何regex或PL/SQL函数的想法都可以帮助实现这一点。

  • 问题内容: 我有一个问题,如果我有一排像这样 我如何将其分成三行,如下所示: / J 问题答案: 您可以使用递归CTE: SQLFiddleDEMO 编辑: 基于Marek Grzenkowicz的回答和MatBailie的评论,全新的想法: 生成从1到max(qty)的数字,并在其上加入表。 SQLFiddle演示

  • 问题内容: 我有一个具有这种结构的表。 我无法弄清楚我将使用哪种SQL查询来获得这样的结果集: 我正在尝试将三列分为三个单独的行。这可能吗? 问题答案: SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQue

  • TL;dr:我如何用pcregrep来拆分每一个多行匹配? 长版本:我有一些文件,有些行以(小写)字符开头,有些以数字或特殊字符开头。如果我至少有两行彼此相邻,以小写字母开头,我希望在我的输出中这样做。但是,我希望每个发现都被分隔/拆分,而不是相互附加。这是正则表达式: 所以,如果我提供这样的文件: 给出的结果是 然而,我想要的是这个: 这可能吗和/或我必须开始使用Python(或类似)?即使建议