SQL 中使用WMSYS.WM_CONCAT把列轉為行來顯示
為了增強應用的可擴充套件性,有時會把某一列的資料,單獨儲存到一個子表中,比如使用者表(t_user)和角色表(t_role),為了儲存他們之間的對應關係,需要設計一箇中間表(t_userrole)用來儲存使用者與角色的對應關係。假如需要檢視每個使用者對應的角色,這時就需要把每個使用者對應的一個或多個角色拼到一起,作為一個欄位顯示出來,下面舉例說明兩種實現方式。
create table test(id,name) as
select 10, 'david' from dual
union all
select 10, 'john' from dual
union all
select 10, 'jerry' from dual
union all
select 20, 'smith' from dual
union all
select 20, 'scott' from dual
union all
select 30, 'tony' from dual
union all
select 30, 'amanda' from dual;
select 10, 'david' from dual
union all
select 10, 'john' from dual
union all
select 10, 'jerry' from dual
union all
select 20, 'smith' from dual
union all
select 20, 'scott' from dual
union all
select 30, 'tony' from dual
union all
select 30, 'amanda' from dual;
建立測試表,包含2個欄位。
第一種方式,使用 WMSYS.WM_CONCAT() 函式。
SQL> select id, WMSYS.WM_CONCAT(name) as allname
2 from test
3 group by id
4 order by id;
2 from test
3 group by id
4 order by id;
ID ALLNAME
---------- --------------------
10 david,john,jerry
20 smith,scott
30 tony,amanda
---------- --------------------
10 david,john,jerry
20 smith,scott
30 tony,amanda
SQL> select WMSYS.WM_CONCAT(name) as allname from test;
ALLNAME
------------------------------------------------------------
david,john,jerry,smith,scott,tony,amanda
------------------------------------------------------------
david,john,jerry,smith,scott,tony,amanda
SQL>
可以看出,該函式就是把引數指定列按順序連線起來。
第二種方式,使用分組函式 row_number() over()來實現。
SQL> select id, max(sys_connect_by_path(name, ',')) as allname
2 from (select a.*, row_number() over(partition by id order by id) rn
3 from test a)
4 group by id
5 start with rn = 1
6 connect by rn - 1 = prior rn
7 and id = prior id
8 order by id;
2 from (select a.*, row_number() over(partition by id order by id) rn
3 from test a)
4 group by id
5 start with rn = 1
6 connect by rn - 1 = prior rn
7 and id = prior id
8 order by id;
ID ALLNAME
---------- --------------------
10 ,david,john,jerry
20 ,smith,scott
30 ,tony,amanda
---------- --------------------
10 ,david,john,jerry
20 ,smith,scott
30 ,tony,amanda
SQL>
由此可見,針對以上分組需求,兩種方式都可以方便實現,不再需要寫單獨的程式程式碼來解決這種顯示問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-712936/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 將多列值轉換為一行顯示
- SQL 行轉列,列轉行SQL
- 使用xml來顯示數學公式 (轉)XML公式
- 將SQL Server中所有表的列資訊顯示出來SQLServer
- 把 React 作為 UI 執行時來使用ReactUI
- SQL列轉行SQL
- PL/SQL Developer顯示行號SQLDeveloper
- Join方法把陣列轉為字串陣列字串
- 在AngularJS中使用谷歌地圖把當前位置顯示出來AngularJS谷歌地圖
- SQL 列行轉換SQL
- sql的行轉列(PIVOT)與列轉行(UNPIVOT)SQL
- XML入門指南(8)使用CSS來顯示XML(轉)XMLCSS
- Oracle中顯示阻塞樹的SQLOracleSQL
- 在sql*plus中顯示長字元SQL字元
- sql實現行轉列SQL
- My SQL 列轉行操作SQL
- Spark SQL中列轉行(UNPIVOT)的兩種方法SparkSQL
- Oracle行轉列、列轉行的Sql語句總結OracleSQL
- 顯示v$sqltext中完整的sql資訊SQL
- windows 10如何把螢幕翻轉過來_win10顯示螢幕翻轉怎麼操作WindowsWin10
- 修改Windows工作列的時間顯示(轉)Windows
- win10怎麼把工作列圖示居中_win10電腦工作列圖示居中顯示設定方法Win10
- 在VC中呼叫WORD(顯示,修改,存檔,執行宏) (轉)
- XML入門指南(9)使用XSL來顯示XML資料(轉)XML
- 怎樣把Oracle查詢轉換為SQL ServerOracleSQLServer
- SQL 把查詢結果當作"表"來使用SQL
- 處理crs_stat -t顯示host列為空
- 巧用列舉來處理UI中顯示值與業務值不同的場景UI
- SQL 行轉列 PIVOT 學習示例SQL
- SQL行轉列統計問題SQL
- Oracle 行轉列的sql語句OracleSQL
- 順序跳躍顯示陣列中的值陣列
- 直接在程式中更改顯示模式 (轉)模式
- T-SQL——將字串轉為單列SQL字串
- oracle中多列轉行Oracle
- 為什莫從資料庫中取出的圖片不能顯示出來資料庫
- linux 列目錄時顯示中文檔名 (轉)Linux
- easyui tree 把選中的值存到資料庫中並從資料庫中取出在tree上顯示出來UI資料庫