oracle一次性说清楚,多种分隔符的一个字段拆分多行,再多行多列多种分隔符拆多行,最终处理超亿亿。。亿级别数据量(上)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 笔记

🎈前言:


       本次在进行大数据需求分析时,接到了一个“简单”的需求,统计多个检测人员的工作量。即成品检测时,我们需分析80-90个检测指标来判定它是否合格,合格后才允许出厂放行。当然要完成这些检测项目,需要多人协作。比如完成主含量的检测,需要甲乙丙丁四个人,完成杂质的检测需要甲乙魑魅魍魉6人、完成粒度检测需要乙丙丁魅魍5人。。。。等等等。假设一共就甲乙丙丁魑魅魍魉8人,因涉及80-90个检测项目,他们都有涉及对应的检测项目,但是具体谁的工作量饱和,谁的不饱和无从得知,因此通过表单统计将检测项目和对应检测人员的信息保存到了表里,只需分析,每个人每天对应每个检测项目检测了多少次,就可以分析对应的工作量饱和情况。哈哈哈,这个需求是不是超级easy~,然而噩梦才刚刚开始。。。

1.png

🎈一、多种分隔符的一个字段拆分多行


       首先我们来看,怎么将一行数据拆分为多行,在这里我们用到了 REGEXP_SUBSTR的这个函数,通过 REGEXP_SUBSTR和对应正则表达式来完成我们拆分的目的。


       为了让大家快速理解代码,对应代码中[^]代表不是某某开头的,即我们拆分的时候,只会拆分列如“1,2,3”的数据,而不会去拆分“,1,2,3”的数据,其中的“+”代表多次匹配,“|”是或者的意思,即当我们有多种分隔符的时候就可以用到,例如拆分“1,2\3,4,5\6”的数据时就需要用到了。具体用法感兴趣的可以去理解oracle正则表达式的内容。


🎨1、拆分的第一种办法

🍋代码:

--第一种写法
SELECT
  REGEXP_SUBSTR ('1,2,3',
  '[^,]+',
  1,
  rownum)
FROM  dual
CONNECT BY
  rownum <= LENGTH ('1,2,3') - LENGTH (regexp_replace('1,2,3', ',', ''))+ 1; 

🍋效果:

2.png

🍋解析:

       如上图所示我们成功,将‘1,2,3’拆分为了1 2 3 的3行,但是此种办法细心的小伙伴会发现有很多空行。因此强烈不推荐!!!

🎨2、第二种办法

🍋代码:

--第二种写法
SELECT
  REGEXP_SUBSTR ('1,2,3','[^,]+',1,
  rownum)
FROM  dual 
CONNECT BY REGEXP_SUBSTR ('1,2,3','[^,]+',1,LEVEL) is not null 

🍋效果:

3.png

🍋解析:

       此种写法代码简洁,出来的结果和我们预想的一致,只出现了我们需要的,1,2,3的3行数据。因此推荐此种写法。

🎨3、多种分隔符的写法

🍋代码:

--第二种写法
SELECT
  REGEXP_SUBSTR ('1,2\3,4,5\6','[^,|\]+',1,
  rownum)
FROM  dual 
CONNECT BY REGEXP_SUBSTR ('1,2\3,4,5\6','[^,|\]+',1,LEVEL) is not null

🍋效果:

4.png

🍋解析:

       如图所示,我们只需在正则表达式中将[^,]改成[^,|\]即可,即通过“|”分隔将分隔符依次罗列即可。是不是脑瓜子嗡嗡嗡的,哈哈哈,别急,更嗡嗡嗡的在后面。

5.png

🎈二、多行多列多种分隔符拆多行


       哈哈哈,经过上面的学习,相信普通的拆分已经难不住你了,因此估计你已经觉得自己可以上天了,此时业务部门告诉你这种情况不知一列,有多列,而且有多种分隔符,此时你会发现你的小脑袋瓜子不够用了。怎么办?不急,我们先瞅瞅现场。

6.png

🎨1、单行多列多分隔符拆分


🍋代码:


--多列拆分
SELECT
  REGEXP_SUBSTR ('1,2\3,4,5\6','[^,|\]+',1,LEVEL) a,
 REGEXP_SUBSTR ('7,8\3,5,9,0,6,4','[^,|\]+',1,LEVEL) a1
FROM  dual 
CONNECT BY REGEXP_SUBSTR ('1,2\3,4,5\6','[^,|\]+',1,LEVEL) is not null
 or   REGEXP_SUBSTR ('7,8\3,5,9,0,6,4','[^,|\]+',1,LEVEL) is not null

🍋效果:

7.png



🍋解析:


       如图所示,当我们拆分单行,多列的数据时,最终的数据会按最多数据列拆分为多行,然后数据一一对应,依次是[(1,7),(2,8),(3,3),(4,5),(5,9),(6,0),('',6),('',4)] ,为了显示所有的数据,因此在CONNECT BY中,用or将多列连接计算。将有3...n列时也是通过or分隔。

相关文章
|
6月前
|
SQL Oracle 关系型数据库
Oracle 将表中的数据查出更改某一字段的值后再插入该表
Oracle 将表中的数据查出更改某一字段的值后再插入该表
133 2
|
6月前
|
SQL Oracle 关系型数据库
Oracle之如何限制字段内数据的录入
Oracle之如何限制字段内数据的录入
80 0
|
6月前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
99 0
|
6月前
|
存储 Oracle 关系型数据库
oracle 过滤字段中的中文,不再洋不洋土不土
oracle 过滤字段中的中文,不再洋不洋土不土
148 0
|
5月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之同步oracle表时,数据量约800万,检查点异常,该如何排查
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
Oracle 关系型数据库 数据安全/隐私保护
oracle 19c 密码字段
oracle 19c 密码字段
66 0
|
6月前
|
存储 Oracle 安全
Oracle 12c的不可见字段:数据的“隐形斗篷”
【4月更文挑战第19天】Oracle 12c引入了不可见字段,这是一种隐藏数据列的特性,用于增强数据安全性和实现业务逻辑。不可见字段在常规查询中不显示,但参与数据操作,适合存储敏感信息或内部元数据。创建时只需在列定义中指定“INVISIBLE”属性。虽然有其限制,如特定查询可能暴露,但正确使用能有效提升数据安全性。了解和利用这一功能对数据管理员至关重要。
|
6月前
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
Oracle 关系型数据库
Oracle 根据某个字段获取第一条数据
Oracle 根据某个字段获取第一条数据
|
存储 Oracle 关系型数据库
Oracle——根据拼音首字母模糊查询某个字段
Oracle——根据拼音首字母模糊查询某个字段