1. 程式人生 > >oracle使用regexp_substr函式將字串拆分成集合

oracle使用regexp_substr函式將字串拆分成集合

在寫儲存過程中,如果傳入的引數是以某個特殊符號(如逗號)分隔的字串,那oracle中如何取到該字串的各個值呢?

可充分使用regexp_substr函式:

REGEXP_SUBSTR函式格式如下:

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

舉例:將'jack,TOM,caryboy,mari'拆分成集合

select regexp_substr('jack,TOM,caryboy,mari', '[^,]+', 1, level)
  from dual
connect by level <= length(regexp_replace('jack,TOM,caryboy,mari' || ',',
                                          '[^,]+',
                                          ''));

或者:

SELECT REGEXP_SUBSTR('jack,TOM,caryboy,mari', '[^,]+', 1, LEVEL, 'i') AS STR 
FROM DUAL 
CONNECT BY LEVEL <= 
 LENGTH('jack,TOM,caryboy,mari') - LENGTH(REGEXP_REPLACE('jack,TOM,caryboy,mari', ',', '')) + 1;

注:oracle的connect by用法,可獲取一個多個數值的列,從而能夠讓結果以多行的形式展示出來

SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=7;   --結果是level有7行,分別1 2 3 4 5 6 7

附:oracle的正則表示式:

方括號表達示

方括號表示式

描述

[[:alnum:]]

字母和數字混合的字元

[[:alpha:]]

字母字元

[[:cntrl:]]

控制字元

[[:digit:]]

數字字元

[[:graph:]]

影象字元

[[:lower:]]

小寫字母字元

[[:print:]]

列印字元

[[:punct:]]

標點符號字元

[[:space:]]

空格字元

[[:upper:]]

大寫字母字元

[[:xdigit:]]

十六進位制數字字元

元字元

元字元

描述

*

如果有前面字串的0次以上出現時匹配

+

如果有前面字串的1次以上出現時匹配

{m}

m是整數。它文字中找出給定子表示式的恰好m次出現

{n}?

前面的字串只出現一次時匹配

{m,}

M是整數。它在文字中找出給定子表達示的至少m次出現

{n,}?

匹配前面的字串至少n

{m,n}

Mn是整數。它在文字中找出給定子表達示的mn次出現

{n,m}

匹配前面的字串至少到n次,但不多於m

c

查詢操作區分大小寫

i

查詢操作不區分大水寫

m

多行字串上的查詢,在源字串包含多行時,該查詢允許用(^)模式匹配字串的開始

n

通常匹配單個字元,也可以匹配新行

x

需要忽略正則表達示中的空格字元時,使用引數‘X

\A

匹配字串首,而不是行首,因而多行字串不能匹配每一行

\d

匹配任意數字字元

\D

匹配任意非數字字元

\s

匹配任意空格字元

\S

匹配任意非空格字元

\w

匹配任意字元和數字。該字元和[:alnum:]之間的不同是\w包括下劃線字元

\W

匹配任意非空字串

*

萬用字元。找出在文字中包含0或多次給定子表示式出現的記錄

+

找出在文字中包含1或多次給定子表示式出現的記錄

找出在文字中包含0次或1次給定子表達示出現的記錄

.

匹配文字中的任意字元

  ^

錨。如果該字元後的表示式出現在行首,則匹配成功

$

錨。如果該字元後的表示式出現在行首,則匹配成功

|

分隔符,使用方法和OR相同

(….)

分組子表示式