oracle行变列,一行分割后变多行

数据库中某一个字段存储格式化的数据,比如一个学号选修的课程,有多个的话,用逗号分隔,需要统计选修课的数量。

第一步先要把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的使用说明

【SQL Tricks】DBMS_RANDOM.VALUE在复制与展开行、字符串拆分中的妙用_水若寒N_新浪博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值