1. 程式人生 > >oracle 資料庫中某個欄位逗號分隔,得到對應列中的個數(列轉行)實現方法

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