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 原理小编也不懂。。。如有大神,请留言指教!!!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页