oracle 数据库中某个字段逗号分隔,得到对应列中的个数(列转行)实现方法

由于各种原因,数据的原则问题,导致某个字段上出现多个数据(依据分隔符隔开),比如 name 字段为 张三;李四;王五等等 需求:求一张表中name字段中出现的个数;
这里写图片描述
想要得到的结果为:
这里写图片描述
对应的sql语句:

------------------------创建表,添加数据-----------------------
create table t_student(
       id number(2) primary key,
       name varchar(10) not null,
       age varchar(2) not null
);
alter table t_student modify name varchar(100); --修改字段大小
insert into t_student(id,name,age) values(1,'张三;李四;王五','11');
insert into t_student(id,name,age) values(2,'张三;赵六','12');
insert into t_student(id,name,age) values(3,'王五;赵六','13');
--查询数据
select * from t_student
------------------------按照条件,执行sql--------------------
SELECT M.NAME NAME,
       COUNT(1) VALUE FROMSELECT REGEXP_SUBSTR(TS.NAME, '[^;]+', 1, L) AS NAME
  FROM T_STUDENT TS, (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL <= 1000)
 WHERE L(+) <= LENGTH(TS.NAME) - LENGTH(REPLACE(TS.NAME, ';')) + 1) M
 GROUP BY M.NAME
 ORDER BY COUNT(1) DESC

说明:
1. REGEXP_SUBSTR() 函数中的 ‘[^;]+’ 是根据你的字段是以什么隔开的;
2. 上述SQL中WHERE条件中的(+)必须加上、否则 TS.NAME 字段为空的数据无法取得、而且加上(+)后、SQL执行效率能够提高几个数量级;

注: 上述SQL 原理小编也不懂。。。如有大神,请留言指教!!!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值