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相同

(….)

分组子表达式

 

你可能感兴趣的:(oracle)