oracle 資料庫中某個欄位逗號分隔,得到對應列中的個數(列轉行)實現方法
阿新 • • 發佈:2019-01-24
由於各種原因,資料的原則問題,導致某個欄位上出現多個數據(依據分隔符隔開),比如 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 FROM(SELECT 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 原理小編也不懂。。。如有大神,請留言指教!!!