行轉列與列轉行
今天寫了可以實現行轉列和列轉行的SQL。
--行轉列
SQL> SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME='T1';
COLUMN_NAME
------------------------------
ID
N1
N2
N3
SQL>
SQL> SELECT SUBSTR(MAX(SYS_CONNECT_BY_PATH(COLUMN_NAME,:P_SPLIT)),2) NEW_COL FROM
2 (
3 SELECT COLUMN_NAME,ROWNUM RN FROM USER_TAB_COLUMNS WHERE TABLE_NAME='T1'
4 )
5 START WITH RN=1
6 CONNECT BY ROWNUM=RN;
NEW_COL
--------------------------------------------------------------------------------
ID,N1,N2,N3
--主要用根據rownum構造層次關係,然後用SYS_CONNECT_BY_PATH實現。
--列轉行
/*
列轉行與根據執行分隔符拆分字串功能類似,這裡用拆分字串功能來說明。
*/
--首先測試分隔符是單個字串
SQL> EXEC :STR:='AS,BDD,CGH,D'
PL/SQL procedure successfully completed
STR
---------
AS,BDD,CGH,D
SQL> EXEC :P_SPLIT:=','
PL/SQL procedure successfully completed
P_SPLIT
---------
,
SQL>
SQL> SELECT DECODE(SIGN(INSTR(:STR, :P_SPLIT)),
2 1,
3 SUBSTR(:STR, --字串
4 DECODE(ROWNUM,
5 1,
6 1,
7 INSTR(:STR, :P_SPLIT, 1, ROWNUM - 1) +
8 LENGTH(:P_SPLIT)), --position
9 DECODE(ROWNUM,
10 1,
11 INSTR(:STR, :P_SPLIT, 1, 1) - 1,
12 ((LENGTH(:STR) -
13 LENGTH(REPLACE(:STR, :P_SPLIT, NULL))) /
14 LENGTH(:P_SPLIT)) + 1,
15 LENGTH(:STR),
16 INSTR(:STR, :P_SPLIT, 1, ROWNUM) -
17 INSTR(:STR, :P_SPLIT, 1, ROWNUM - 1) -
18 LENGTH(:P_SPLIT))),
19 :STR) NEW_COL --substring_length
20 FROM DUAL
21 CONNECT BY ROWNUM <= ((LENGTH(:STR) - LENGTH(REPLACE(:STR, :P_SPLIT, NULL))) /
22 LENGTH(:P_SPLIT)) + 1;
NEW_COL
--------------------------------------------------------------------------------
AS
BDD
CGH
D
--可以看到結果已經根據都好被分成4行了
--接著測試分隔符是任意長字元
SQL> EXEC :STR:='AS||BDD||CGH||D'
PL/SQL procedure successfully completed
STR
---------
AS||BDD||CGH||D
SQL> EXEC :P_SPLIT:='||'
PL/SQL procedure successfully completed
P_SPLIT
---------
||
SQL> SELECT DECODE(SIGN(INSTR(:STR, :P_SPLIT)),
2 1,
3 SUBSTR(:STR, --字串
4 DECODE(ROWNUM,
5 1,
6 1,
7 INSTR(:STR, :P_SPLIT, 1, ROWNUM - 1) +
8 LENGTH(:P_SPLIT)), --position
9 DECODE(ROWNUM,
10 1,
11 INSTR(:STR, :P_SPLIT, 1, 1) - 1,
12 ((LENGTH(:STR) -
13 LENGTH(REPLACE(:STR, :P_SPLIT, NULL))) /
14 LENGTH(:P_SPLIT)) + 1,
15 LENGTH(:STR),
16 INSTR(:STR, :P_SPLIT, 1, ROWNUM) -
17 INSTR(:STR, :P_SPLIT, 1, ROWNUM - 1) -
18 LENGTH(:P_SPLIT))),
19 :STR) NEW_COL --substring_length
20 FROM DUAL
21 CONNECT BY ROWNUM <= ((LENGTH(:STR) - LENGTH(REPLACE(:STR, :P_SPLIT, NULL))) /
22 LENGTH(:P_SPLIT)) + 1;
NEW_COL
--------------------------------------------------------------------------------
AS
BDD
CGH
D
--結果是正確的。
以上測試在9201上透過。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63808/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql的行轉列(PIVOT)與列轉行(UNPIVOT)SQL
- SQL 行轉列,列轉行SQL
- Mysql - 行轉列、列轉行MySql
- hive經典案列--top N(行轉列\列轉行)Hive
- oracle列轉行Oracle
- SQL列轉行SQL
- Oracle行轉列、列轉行的Sql語句總結OracleSQL
- mysql動態行轉列MySql
- My SQL 列轉行操作SQL
- oracle中多列轉行Oracle
- Hive行轉列函式Hive函式
- mysql基礎 行轉列MySql
- Databricks 第11篇:Spark SQL 查詢(行轉列、列轉行、Lateral View、排序)SparkSQLView排序
- MySQL 行轉列詳情鍾萼MySql
- SQL 行轉列 PIVOT 學習示例SQL
- oracle行轉列、列轉行、連續日期數字實現方式及mybatis下實現方式OracleMyBatis
- excel列轉行怎麼做 excel如何轉置行列Excel
- List,DataTable實現行轉列的通用方案
- 資料庫知識點(2)——行轉列資料庫
- Linux命令之grep/sed/awk等行轉列Linux
- iOS 字典轉陣列,陣列轉字典iOS陣列
- unnest array_contains 行轉列 id in效率高AI
- 直播平臺原始碼,FlinkSQL實現行轉列原始碼SQL
- Spark SQL中列轉行(UNPIVOT)的兩種方法SparkSQL
- 用listagg函式分組實現列轉行函式
- PHP xml 轉陣列 陣列轉 xml 操作PHPXML陣列
- js將陣列轉字元,字元轉回陣列JS陣列字元
- 在Linux命令列中進行大小寫字元轉換Linux命令列字元
- 陣列與字串方法與相互轉換陣列字串
- Java 集合與陣列互相轉換Java陣列
- Java中List與陣列互轉Java陣列
- string與char陣列相互轉換陣列
- 輪轉陣列陣列
- mysql~GROUP_CONCAT實現關係表的行轉列MySql
- 【函式】Oracle12c 列轉行函式使用listagg函式Oracle
- Linux命令列:對內容進行大小寫字元轉換 Linux命令列字元
- PHP 陣列轉樹結構/樹結構轉陣列PHP陣列
- xml與陣列的相互轉換——phpXML陣列PHP