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

2021-08-01 16:46:24 字數 1978 閱讀 8219

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

中也介紹到。

參考這一段 「

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

select wmsys.wm_concat(name) from employee;

結果: user1,user2

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

方法就是使用函式:  regexp_substr

這個函式, 看名字乙個正規表示式匹配的函式。 具體的格式如下:

function regexp_substr(string, pattern, position, occurrence, modifier)

__srcstr     :需要進行正則處理的字串

__pattern    :進行匹配的正規表示式

__position   :起始位置,從第幾個字元開始正規表示式匹配(預設為1)

__occurrence :標識第幾個匹配組,預設為1

__modifier   :模式('i'不區分大小寫進行檢索;'c'區分大小寫進行檢索。預設為'c'。)

使用例子的話, 

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

[sql]view plain

copy

select

regexp_substr(

'user1,user2'

,'[^,]+'

,1,2,

'i') 

asstr 

from

dual;   

結果 : user2

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

[sql]view plain

copy

select

regexp_substr(

'user1,user2'

,'[^,]+'

,1,level

,'i'

) as

str 

from

dual 

connect

bylevel

<3;   

結果: 

user1

user2

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

完善一下:

[sql]view plain

copy

select

regexp_substr(

'user1,user2'

,'[^,]+'

,1,level

,'i'

) as

str 

from

dual 

connect

bylevel

<=length(

'user1,user2'

) - length(regexp_replace(

'user1,user2'

, ','

, ''

))+1;   

這裡計算個數使用的方式是:

[sql]view plain

copy

select

length(

'user1,user2'

) - length(regexp_replace(

'user1,user2'

, ','

, ''

))+1 

from

dual;  

原理就是用原字串的長度 減去 替換掉分割字串的長度 就是有多上個分割字串了, 再加上1 就是有多上個元素了。

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

在 oracle 中,將某乙個欄位的多行資料轉換成使用逗號風格的一行顯示,可以使用函式 wmsys.wm concat 達成。這個在上一篇 中也介紹到。參考這一段 case 1 列轉換行。以一行顯示所有員工的名字 select wmsys.wm concat name from employee 結...

Tensorflow Tensor合併與拆分

tensorflow tensor合併與拆分,合併tensor concat tensor1,tensor2 div,name concat 陣列d和b都是3 2 1的三維陣列,根據指定的維數合併,將對應維上的兩個陣列進行拼接。拆分tensor dynamic partition data,part...

Oracle中的行列轉換 行轉列

create table chengji id number,name varchar2 20 course varchar2 20 score number insert into chengji id,name,course,score values 1,張三 語文 67 insert into...