首页 > 其他分享 >浅析REGEXP_SUBSTR,PRIOR,CONNECT BY

浅析REGEXP_SUBSTR,PRIOR,CONNECT BY

时间:2024-11-26 09:37:52浏览次数:8  
标签:SUBSTR 递归 LEVEL PRIOR prior CONNECT REGEXP 浅析 connect

业务场景

image

teacher表中的tech_class字段存储的是每个老师所教授的课程,课程之间以英文逗号分隔。现在要用语句统计每个课程对应的教师数量。语句及效果如下:

image

语句其实很简单,各种博客或者gpt都有不错且可行的解决方案,我们主要来理解下这段语句的执行原理,更好的学习。

part1 REGEXP_SUBSTR

关于REGEXP_SUBSTR的官方文档

具体语法这里不再赘叙,我们从单个例子入手看看效果:

image

image

REGEXP_SUBSTR可以将字段字符串根据所给正则表达式匹配并拆分(注意不是分割,但效果上等同于分割)。

最后一个参数代表要取出第几个匹配的结果:

image

那为什么这里要使用LEVEL?LEVEL是什么?

关于LEVEL的官方解释 具体如图:

image

使用之前要注意,官方文档里有句话:

To define a hierarchical relationship in a query, you must use the CONNECT BY clause.

所以关于connect by,你可以先往后看。

使用LEVEL后的效果:

image

LEVEL是一个在CONNECT BY子句中使用的伪列,它代表当前递归层次的级别。在每次递归调用中,LEVEL的值会增加1。在这个例子中,LEVEL的值会从1开始,一直到tech_class中逗号分隔的子串的数量——3。

为什么这样会有81条?我们的预期结果其实是3条。让我们继续探究......

image

image

image

Football是字段里的第一个值,只有1条;Basketball是字段里的第二个值,有10条;PingPang是字段里的第三个值,有70条!貌似越往后数据重复越多,而且次数增长的可怕,但很难发现出有什么规律。检索后基本确定出现重复数据是因为在递归过程中,regexp_substr函数没有正确移动到下一个匹配项,而是重复移动到了Basketball或者PingPang,至于它底层是什么重复移动的,额我也没搞明白....。

对此我们需要添加prior确保每次递归时都能正确提取。

part3 prior

关于prior的简单介绍
connect by中加prior可以限定父子的对应关系,限定递归路径。这里对同条记录进行递归:

image

加sys_guid()是为了保证层次查询,存在循环时,不出现无限递归。它为每行生成一个唯一标识,从而避免无限循环。

Part3 connect by

CONNECT BY的官方文档--分级查询
connect by常常结合prior一起实现父级查询。因此connect by LEVEL prior一般都一起出现。

最后再次附上针对原始的业务需求的完整的语句及输出:

select
regexp_substr(tech_class, '[^,]+', 1, LEVEL) as class_name,
tech_name
from teacher
CONNECT BY LEVEL <= REGEXP_COUNT(tech_class, '[^,]+')
and prior tech_class = tech_class
and prior sys_guid() is not null
order by class_name

image

标签:SUBSTR,递归,LEVEL,PRIOR,prior,CONNECT,REGEXP,浅析,connect
From: https://www.cnblogs.com/lhcc924/p/18568181

相关文章

  • 【论文阅读】Zero-Reference Low-Light Enhancement via Physical Quadruple Priors(CV
    概要任务领域:低光增强;零样本/无参考;RGB域针对问题:零参考是成功的,但是缺少光照概念,依赖手工设置。解决方法:基于Kubelka-Munk理论,设计物理四先验作为低光和正常光的不变要素,再利用生成模型将先验转为图像。主要创新:物理四先验的设计;先验到图像的映射。最终表现:优于大多数无监......
  • FreeRTOS LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 存在的意义以及高于它的中断不能调
    ThisishowIunderstandit.我是这样理解的。Ifwenowhave2tasksand6interrupts,amongwhich,andwheninterrupts4,5,6arerunning,theywillcallthesafefreertosapi.假如我们现在有2个任务以及6个中断,其中,中断4、5、6运行的时候将会调用safefreert......
  • java_PriorityQueue_内置堆存储抽象类_lambda定义比较规则
    创建存储单个普通元素的堆importjava.util.PriorityQueue;importjava.util.Comparator;publicclasstest{publicstaticvoidmain(String[]args){ PriorityQueue<Integer>minheap=newPriorityQueue<>();//默认小顶堆 PriorityQueue<Integer>maxheap=new......
  • 实战网络攻防中的高版本JDK反射类加载浅析
    就是要打骨折http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247486065&idx=2&sn=b30ade8200e842743339d428f414475e&chksm=c0e4732df793fa3bf39a6eab17cc0ed0fca5f0e4c979ce64bd112762def9ee7cf0112a7e76af&scene=21#wechat_redirect《Java代码审计》http:......
  • Vue Router 浅析
    路由原理hash和history众所周知,hash和history在前端面试中是很常考的一道题目。在学习本文内容之前,周一对hash和history的认知可能就在hash的url里面多了个#,而history就不会。然后,我认知里还有一个是只有history才能做前后端分离,而hash跟前后端分离没......
  • 优先级队列(priority_queue)
     priority_queue简介   优先级队列的底层结构其实就是堆,就是我们在学习二叉树的时候学习的堆。它是一种逻辑结构,底层还是vector,我们把它想象成一个堆结构。    我们在学习堆的时候,知道了它的父亲和左右孩子的关系。它如果存在孩子,则一定存在这一种关系,leftchi......
  • 从HCI层浅析BLE Audio通话建立流程
    背景BLEAUDIO音乐播放已经调通了,接下来调试BLEAUDIO的通话,BLEAUDIO通话跟音乐协议类似,都是走CIS链路,也是用同样的codec,比经典蓝牙音乐和通话分别采用不同的A2DP和HFP显得协调多了,下面还是以手机和2个蓝牙耳机为例,结合HCILOG来分析LEAUDIO通话协议的建立:连接建立过程......
  • 【C++】priority_queue的介绍和模拟实现
    【C++】priority_queue的介绍和模拟实现一.priority_queue的介绍1.priority_queue的基本介绍2.priority_queue的使用介绍二.priority_queue的模拟实现一.priority_queue的介绍1.priority_queue的基本介绍优先队列是一种容器适配器,根据严格的弱排序标准,它的......
  • 优先级队列 ( PriorityQueue )
    文章目录前言一、优先级队列1.1、概念二、优先级队列的模拟实现2.1、堆的概念2.2、堆的存储方式 2.3、堆的创建2.4、堆的插入与删除三、常用接口介绍3.1、Top-k问题3.2、使用PriorityQueue创建大小堆,解决TOPK问题前言        前几篇我们讲解过队列,其是一种先......
  • 力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树
    之前发过一篇,感觉还有深挖的地方,于是又补充一些信息这题目虽然是middle难度题目,要解答出来是只要easy的时间,但是深挖可以有hard的难度题解1可以帮助复习线段树的使用,题解2可以复习一下java基础知识题解1线段树这是自己憋出来的线段树classSeatManager{......