oracle行列轉換-多行轉換成字串
建表語句及初始化資料指令碼如下:
多行轉換成字串有以下多種方式
1)MAX + decode
適用範圍:8i,9i,10g及以後版本
2)row_number + lead(適用範圍:8i,9i,10g及以後版本)
點選(此處)摺疊或開啟
-
SQL> create table t_row_str(
-
2 id int,
-
3 col varchar2(10));
-
-
表已建立。
-
-
SQL> insert into t_row_str values(1,'a');
-
-
已建立 1 行。
-
-
SQL> insert into t_row_str values(1,'b');
-
-
已建立 1 行。
-
-
SQL> insert into t_row_str values(1,'c');
-
-
已建立 1 行。
-
-
SQL> insert into t_row_str values(2,'a');
-
-
已建立 1 行。
-
-
SQL> insert into t_row_str values(2,'d');
-
-
已建立 1 行。
-
-
SQL> insert into t_row_str values(2,'e');
-
-
已建立 1 行。
-
-
SQL> insert into t_row_str values(3,'c');
-
-
已建立 1 行。
-
-
SQL> commit;
-
-
提交完成。
-
-
SQL> select * from t_row_str;
-
-
ID COL
-
---------- ----------
-
-
1 a
-
1 b
-
1 c
-
2 a
-
2 d
-
2 e
-
3 c
-
- 已選擇7行。
1)MAX + decode
適用範圍:8i,9i,10g及以後版本
點選(此處)摺疊或開啟
-
SQL> select id,max(decode(rn,1,col,null))||
-
2 max(decode(rn,2,','||col,null))||
-
3 max(decode(rn,3,','||col,null)) str
-
4 from(select id,col,row_number() over(partition by id order by col) as rn
-
5 from t_row_str) t
-
6 group by id
-
7 order by 1;
-
-
ID STR
-
---------- --------------------------------
-
-
1 a,b,c
-
2 a,d,e
- 3 c
點選(此處)摺疊或開啟
-
SQL> select id,str from (select id,row_number() over(partition by id order by col) as
-
2 rn,
-
3 col||lead(','||col,1) over(partition by id order by col)||lead(','||col,2) over(partition by id
-
order by col) as str
-
4 from t_row_str)
-
5 where rn=1
-
6 order by 1
-
7 /
-
-
ID STR
-
---------- --------------------------------
-
-
1 a,b,c
-
2 a,d,e
- 3 c
注:oracle的lead函式是偏移量函式,其用途是訪問某一欄位的下一個值(lag函式用法一樣,只是訪問上一個值)。如下程式碼所示:
3)MODEL
適用範圍:10g及以後版本
4)sys_connect_by_path
適用範圍:8i,9i,10g及以後版本
注:sys_connect_by_path函式使用之前,必須先構造出一個樹,否則無法使用,上例用row_number函式構造樹型結構。
5)wmsys.wm_concat
適用範圍:10g及以後版本
這個函式預定義按','分隔字串,若要用其他符號分隔可以用,replace將','替換。
點選(此處)摺疊或開啟
-
SQL> select id,col,lead(col,1) over(partition by id order by col) lead_1,
-
2 lead(col,2) over(partition by id order by col) lead_2,
-
3 lead(col,3) over(partition by id order by col) lead_3
-
4 from t_row_str;
-
-
ID COL LEAD_1 LEAD_2 LEAD_3
-
---------- ---------- ---------- ---------- ----------
-
-
1 a b c
-
1 b c
-
1 c
-
2 a d e
-
2 d e
-
2 e
-
3 c
-
- 已選擇7行。
3)MODEL
適用範圍:10g及以後版本
點選(此處)摺疊或開啟
-
SQL> SELECT id, substr(str, 2) str FROM t_row_str
-
2 MODEL
-
3 RETURN UPDATED ROWS
-
4 PARTITION BY(ID)
-
5 DIMENSION BY(row_number() over(PARTITION BY ID ORDER BY col) AS rn)
-
6 MEASURES (CAST(col AS VARCHAR2(20)) AS str)
-
7 RULES UPSERT
-
8 ITERATE(3) UNTIL( presentv(str[iteration_number+2],1,0)=0)
-
9 (str[0] = str[0] || ',' || str[iteration_number+1])
-
10 ORDER BY 1;
-
-
ID STR
-
---------- --------------------------------------
-
-
1 a,b,c
-
2 a,d,e
- 3 c
4)sys_connect_by_path
適用範圍:8i,9i,10g及以後版本
點選(此處)摺疊或開啟
-
SQL> edit;
-
已寫入 file afiedt.buf
-
-
1 SELECT t.id id, MAX(substr(sys_connect_by_path(t.col, ','), 2)) str
-
2 FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
-
3 FROM t_row_str) t
-
4 START WITH rn = 1
-
5 CONNECT BY rn = PRIOR rn + 1
-
6 AND id = PRIOR id
-
7* GROUP BY t.id
-
SQL> /
-
-
ID STR
-
---------- --------------------------------------
-
-
1 a,b,c
-
2 a,d,e
- 3 c
-
以下程式碼適用於10G及之後的版本
-
SQL> edit
-
已寫入 file afiedt.buf
-
-
1 SELECT t.id id, substr(sys_connect_by_path(t.col, ','), 2) str
-
2 FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
-
3 FROM t_row_str) t
-
4 where connect_by_isleaf=1
-
5 START WITH rn = 1
-
6 CONNECT BY rn = PRIOR rn + 1
-
7* AND id = PRIOR id
-
SQL> /
-
-
ID STR
-
---------- --------------------------------------
-
-
1 a,b,c
-
2 a,d,e
- 3 c
5)wmsys.wm_concat
適用範圍:10g及以後版本
這個函式預定義按','分隔字串,若要用其他符號分隔可以用,replace將','替換。
點選(此處)摺疊或開啟
-
SQL> select id,wmsys.wm_concat(col) from t_row_str
-
2 group by id;
-
-
ID
-
----------
-
-
WMSYS.WM_CONCAT(COL)
-
-------------------------------------------------------
-
-
1
-
a,b,c
-
-
2
-
a,d,e
-
-
3
- c
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1066878/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle行列轉換及pivot子句的用法Oracle
- mysql行列轉換詳解MySql
- InputStream流轉換成String字串字串
- 記錄一個行列轉換
- pdf轉換成word,免費轉換
- Oracle轉換PostgresOracle
- Oracle 12c nocdb轉換成cdbOracle
- 字串-大小寫轉換字串
- list與字串轉換字串
- scala常用操作-Tuple元祖轉換成String字串字串
- JZ-049-把字串轉換成整數字串
- Spark實現行列轉換pivot和unpivotSpark
- Oracle中REGEXP_SUBSTR函式(字串轉多行)Oracle函式字串
- Oracle 查詢轉換Oracle
- Restcloud ETl實踐之資料行列轉換RESTCloud
- JavaScript字串大小寫轉換JavaScript字串
- JavaScript字串轉換數字JavaScript字串
- 字串轉換整數(atoi)字串
- 字串 列表 字典 互相轉換字串
- Oracle實驗(02):轉換 & 轉譯Oracle
- char轉換成int
- 圖片格式轉換,JPG圖片轉換成PDF
- 【Go】IP地址轉換:數字與字串之間高效轉換Go字串
- Oracle 12CR2查詢轉換之星型轉換Oracle
- Oracle SQL_ID轉換成SQL_HASH_VALUEOracleSQL
- 字串json陣列怎麼轉換成jsonobject型別字串JSON陣列Object型別
- 劍指offer——把字串轉換成整數C++字串C++
- 使用vue實現行列轉換的一種方法。Vue
- json字串 轉換為陣列JSON字串陣列
- json字串與物件互相轉換JSON字串物件
- JavaScript 字串轉換為陣列JavaScript字串陣列
- JSON字串與HashMap相互轉換JSON字串HashMap
- Java 浮點到字串轉換Java字串
- 將字串轉換成大寫 2020.12.28字串
- 成績轉換 HDU - 2004
- Java物件轉換成MapJava物件
- pdf轉換成word文件
- 轉換成浮點數
- 轉換成為整數