[Oracle]行列轉換(行合并與拆分)

來源:互聯網
上載者:User

標籤:

使用wmsys.wm_concat 實現行合并

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

這個在上一篇

oracle內建函數 wmsys.wm_concat使用 中也介紹到。

參考這一段 “

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

     select wmsys.wm_concat(NAME) from employee;

     結果: user1,user2

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

方法就是使用函數:  regexp_substr



使用regexp_substr 實現行拆分

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

function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr     :需要進行正則處理的字串
__pattern    :進行匹配的Regex
__position   :起始位置,從第幾個字元開始Regex匹配(預設為1)
__occurrence :標識第幾個匹配組,預設為1
__modifier   :模式(‘i‘不區分大小寫進行檢索;‘c‘區分大小寫進行檢索。預設為‘c‘。)


使用例子的話,

對於 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 就是有多上個元素了。








[Oracle]行列轉換(行合并與拆分)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.