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行列轉換-字串轉換成多列Oracle字串
- oracle行列轉換-多列轉換成字串Oracle字串
- Oracle多行轉換成字串方法總結Oracle字串
- Oracle-行列轉換Oracle
- oracle行列轉換-行轉列Oracle
- oracle行列轉換-列轉行Oracle
- Oracle 行列轉換 經典Oracle
- Oracle 行列轉換總結Oracle
- Oracle 行列轉換小結Oracle
- Oracle行列轉換總結Oracle
- 行列轉換
- oracle和mysql的行列轉換OracleMySql
- 將字串轉換成Bitmap型別 或者 將Bitmap轉換成字串字串型別
- Kettle行列轉換
- 偽行列轉換!
- 行列轉換sqlSQL
- 行列轉換,列行轉換統計
- 行列轉換 交叉表 (轉)
- pivot、unpivot實現oracle行列轉換Oracle
- Oracle--SQL行列轉換實戰OracleSQL
- MySQL行列轉換拼接MySql
- 行列轉換之大全~~~
- sql server 行列轉換SQLServer
- 將整數轉換成字串字串
- Oracle行列轉換及pivot子句的用法Oracle
- mysql行列轉換詳解MySql
- sql server行列轉換案例SQLServer
- 【SQL 學習】行列轉換SQL
- 【SQL】行列轉換方法示例SQL
- Shell練習 行列轉換
- 複雜的行列轉換
- 試驗Oracle中實現行列轉換的方法(轉)Oracle
- 字串轉換字串
- oracle 11g 使用 pivot/unpivot 行列轉換Oracle
- 用ORACLE分析函式實現行列轉換Oracle函式
- InputStream流轉換成String字串字串
- oracle日期轉換成星期Oracle
- 大小寫互換-"數字字串"轉換成數字字串