[Oracle]行列轉換(行合並與拆分)
阿新 • • 發佈:2017-07-02
csdn employee .net title case color trac 數據轉換 con
使用wmsys.wm_concat 實現行合並
使用regexp_substr 實現行拆分
結果:
這裏計算個數使用的方式是:
原理就是用原字串的長度 減去 替換掉切割字符串的長度 就是有多上個切割字符串了, 再加上1 就是有多上個元素了。
使用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 實現行拆分
這個函數。 看名字一個正則表達式匹配的函數。
詳細的格式例如以下:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :須要進行正則處理的字符串
__pattern :進行匹配的正則表達式
__position :起始位置。從第幾個字符開始正則表達式匹配(默覺得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]行列轉換(行合並與拆分)