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} |
M和n是整數。它在文字中找出給定子表達示的m到n次出現 |
{n,m} |
匹配前面的字串至少到n次,但不多於m次 |
c |
查詢操作區分大小寫 |
i |
查詢操作不區分大水寫 |
m |
多行字串上的查詢,在源字串包含多行時,該查詢允許用(^)模式匹配字串的開始 |
n |
通常匹配單個字元,也可以匹配新行 |
x |
需要忽略正則表達示中的空格字元時,使用引數‘X’ |
\A |
匹配字串首,而不是行首,因而多行字串不能匹配每一行 |
\d |
匹配任意數字字元 |
\D |
匹配任意非數字字元 |
\s |
匹配任意空格字元 |
\S |
匹配任意非空格字元 |
\w |
匹配任意字元和數字。該字元和[:alnum:]之間的不同是\w包括下劃線字元 |
\W |
匹配任意非空字串 |
* |
萬用字元。找出在文字中包含0或多次給定子表示式出現的記錄 |
+ |
找出在文字中包含1或多次給定子表示式出現的記錄 |
? |
找出在文字中包含0次或1次給定子表達示出現的記錄 |
. |
匹配文字中的任意字元 |
^ |
錨。如果該字元後的表示式出現在行首,則匹配成功 |
$ |
錨。如果該字元後的表示式出現在行首,則匹配成功 |
| |
分隔符,使用方法和OR相同 |
(….) |
分組子表示式 |