业务场景

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

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

part1 REGEXP_SUBSTR

关于REGEXP_SUBSTR的官方文档

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

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

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

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

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

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

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

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

使用LEVEL后的效果:

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

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

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

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

part3 prior

关于prior的简单介绍

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

加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

浅析REGEXP_SUBSTR,PRIOR,CONNECT BY的更多相关文章

  1. Oracle中使用REGEXP_SUBSTR,regexp_replace函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...

  2. Oracle中使用REGEXP_SUBSTR,regexp_replace,wm_concat函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...

  3. 笔记整理--Linux_Socket

    揭开Socket编程的面纱 - 博客 - 伯乐在线 - Google Chrome (2013/9/22 19:28:24) 揭开Socket编程的面纱 2013/09/21 | 分类: IT技术 | ...

  4. Oracle 树操作(select…start with…connect by…prior)

    摘自:http://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html oracle树查询的最重要的就是select…start with ...

  5. Start with connect by prior 递归查询

    在SELECT命令中使用CONNECT BY和START WITH子句可以查询表中的树型结构关系.其命令格式如下: SELECT * from CONNECT BY {PRIOR列名1=列名2|列名1 ...

  6. 在oracle中通过connect by prior来实现递归查询!

    注明:该文章为引用别人的文章,链接为:http://blog.csdn.net/apicescn/article/details/1510922 ,本人记录下来只是为了方便查看 原文: connect ...

  7. [z]START WITH CONNECT BY PRIOR子句实现递归查询

    [z]http://jingyan.baidu.com/article/5d368d1e182bb93f60c05784.html START WITH CONNECT BY PRIOR这个语法主要用 ...

  8. start with connect by prior 递归查询用法

    这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点. 先看原始数据: create table a_test ( parentid ), sub ...

  9. [转]Oracle 树操作(select…start with…connect by…prior)

    转自http://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html Oracle 树操作(select-start with-conne ...

  10. oracle start with connect by prior 递归查询

    Oracle中的select语句可以用start with...connect by prior子句实现递归查询,connect by 是结构化查询中用到的, 其基本语法是: select ... f ...

随机推荐

  1. NFS挂载时出现mount

    NFS挂载时出现"mount.nfs: access denied by server while mounting "的解决方法 1.使用了非法端口,也就是使用了大于1024的端 ...

  2. Go runtime 调度器精讲(九):系统调用引起的抢占

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 第八讲介绍了当 goroutine 运行时间过长会被抢占的情况.这一讲继续看 goroutine 执行系统调用时间过长的抢占. 1. 系统调用时 ...

  3. Java项目笔记(四)

    1.包装类判断是否相等时,建议用equals 而不是 == 号 2.+= 默认包含了强制类型转换,单纯的s = s+1;编译是无法通过的,因为1属于int类型,必须显示声明强制类型转换 short s ...

  4. nexus 部署与设置

    安装nexus df -h 先查看目录磁盘空间,我安装的版本占用了四个G 空间,目录文件空间不够导致启动失败 上传 nexus 压缩包,并解压 查询 8081 端口号是否被占用 sudo netsta ...

  5. PHP提薪模块

    在使用es搜索的时候需要注意以下这几点 文档(Document)与索引(Index):在ES中,文档是最小的数据单元,类似于数据库中的一行记录.文档组织在索引中,索引类似于数据库中的表.了解如何创建索 ...

  6. 进程D 状态的产生及原因解释

    在 Linux 系统中,进程的 D 状态表示进程处于不可中断的睡眠状态 (Uninterruptible Sleep).这种状态通常由进程等待某些资源或事件引起,这些资源或事件无法立即可用.以下是一些 ...

  7. js中常见的继承

    1. 使用原型链继承 2. 通过构造函数继承 通过构造函数,创建的实例,可以访问构造函数的属性和方法,以及可以访问构造函数的原型对象 prototype 上的数据和方法 : 3. 组合继承(1 和 2 ...

  8. kotlin更多语言结构——>空安全

    可空类型与非空类型 Kotlin 的类型系统旨在从我们的代码中消除 NullPointerException .NPE 的唯一可能的原因可能是: -  显式调用 throw NullPointerEx ...

  9. 王树森Attention与Self-Attention学习笔记

    目录 Seq2Seq + Attention Attention的原理 方法一(Used in the original paper) 方法二(more popular,the same to Tra ...

  10. 云原生周刊:KubeSphere 宣布开源 Thanos 的企业级发行版 Whizard

    开源项目推荐 Admiralty Admiralty 是一个 Kubernetes 控制器系统,可以智能地在多个集群之间调度工作负载.它使用简单,并且易于与其他工具集成. Cozystack Cozy ...