程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle行列轉換(行合並與拆分)

Oracle行列轉換(行合並與拆分)

編輯:Oracle教程

Oracle行列轉換(行合並與拆分)


使用wmsys.wm_concat 實現行合並

在 Oracle 中, 將某一個欄位的多行數據轉換成使用逗號風格的一行顯示,可以使用函數 wmsys.wm_concat 達成。

這個在上一篇http://www.Bkjia.com/database/201204/128928.html

oracle內置函數 wmsys.wm_concat使用

中也介紹到。

參考這一段 “

Case 1: 列轉換行。 以一行顯示所有員工的名字

select wmsys.wm_concat(NAME) from employee;

結果: user1,user2

現在有個問題, 反過來如何顯示? 也就是說有一個欄位的值類似: user1,user2, 現在要把它拆分成兩行顯示。

方法就是使用函數: regexp_substr

使用regexp_substr 實現行拆分

這個函數, 看名字一個正則表達式匹配的函數。 具體的格式如下:

使用例子的話,

對於 user1, user2 , 如果要匹配第二個的話(user2)的話, 可以使用以下 SQL:

SELECT REGEXP_SUBSTR('user1,user2','[^,]+',1,2,'i') AS STR FROM DUAL; 
結果 : user2

如果要匹配所有的話,使用如下方式:

SELECT REGEXP_SUBSTR('user1,user2','[^,]+',1,LEVEL,'i') AS STR FROM DUAL CONNECT BY LEVEL<3; 

user1

user2

看起來達成效果了。 不過這裡的LEVEL, 很多狀況下是一個變量, 是可以通過運算得出來的。

完善一下:

SELECT REGEXP_SUBSTR('user1,user2','[^,]+',1,LEVEL,'i') AS STR FROM DUAL CONNECT BY LEVEL<=LENGTH('user1,user2') - LENGTH(REGEXP_REPLACE('user1,user2', ',', ''))+1; 
select LENGTH('user1,user2') - LENGTH(REGEXP_REPLACE('user1,user2', ',', ''))+1 from dual;

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved