数据库中某一个字段存储格式化的数据,比如一个学号选修的课程,有多个的话,用逗号分隔,需要统计选修课的数量。
第一步先要把class拆分为列,使用,分割,REGEXP_SUBSTR(class, '[^,]+', 1, 1, 'i')
如图所示,只要把1换为对应的位置,就可以取到所有的值。使用level
select level from dual connect by level < = 6;
以上就取到了所有的选修课程,可是当有多行的时候,明显多了很多数据,并且受行数影响,结果集数量随行数指数型暴增。为什么会出现这样的结果?
是因为level本质是表示的层级数,并不是rownum这种单纯的序列。在connect by条件中若没有指定上下级关系,那么每一行都会作为其它行的父级与子级。
知道了多余的结果是重复递归造成的,所以要加上必要的递归条件过滤多余的结果。
既然原因是没有指定父子连接条件,那就指定一个条件,它限制自己只能是自己的父级或子级。只取自己,prior id = id,"张三" ->"张三"->"张三"又陷入了死循环,加上如下条件,终止死循环(至于为什么能终止循环,原理尚不清楚,待补充)
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL的使用说明