oracle拆分逗号分隔字符串 实现split

如果一个字符串中有像逗号或其它符号分隔,你想把它折分成列,如’first field, second field , third field’,
拆成

first field
second field
third field

1.针对  '1','2','3','4','5'(逗号在字符串外面):

SQL> SELECT COLUMN_VALUE  FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5'));
 
COLUMN_VALUE
--------------------------------------------------------------------------------
1
2
3
4
5

2.针对'1,2,3,4,5'(逗号在字符串里面)(用10G开始支持的正则表达式):

SQL> select regexp_substr('1,2,3,4,5','[^,]+',1,rownum) from dual
  2  connect by rownum<=length('1,2,3,4,5')-length(replace('1,2,3,4,5',','))+1
  3  ;
 
REGEXP_SUBSTR('1,2,3,4,5','[^,
------------------------------
1
2
3
4
5

TIP:
REGEXP_SUBSTR 函数是把那个串以正则不是以,(逗号)开头的截取,第二个参数是取第几组,rownum伪列序号,connect 循环 ,循环次数为串总长度-去除分隔符后=几个分隔符 +1

3.使用函数

CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
----------------------------------------------------------------
CREATE OR REPLACE FUNCTION fn_split (p_str IN CLOB, p_delimiter IN VARCHAR2)
 RETURN ty_str_split
IS
  j INT := 0;
  i INT := 1;
  len INT := 0;
  len1 INT := 0;
  str VARCHAR2 (4000);
  str_split ty_str_split := ty_str_split ();
BEGIN
  len := LENGTH (p_str);
  len1 := LENGTH (p_delimiter);
 
  WHILE j < len
  LOOP
    j := INSTR (p_str, p_delimiter, i);
 
    IF j = 0
    THEN
        j := len;
        str := SUBSTR (p_str, i);
        str_split.EXTEND;
        str_split (str_split.COUNT) := str;
 
        IF i >= len
        THEN
          EXIT;
        END IF;
    ELSE
        str := SUBSTR (p_str, i, j - i);
        i := j + len1;
        str_split.EXTEND;
        str_split (str_split.COUNT) := str;
    END IF;
  END LOOP;
 
  RETURN str_split;
END fn_split;

测试:

SQL> select * from table(fn_split('1,2,3,4,5',',')); --第二个单引号中是前面字符串中需要被分隔的字符

COLUMN_VALUE ----------------------------------- 1 2 3 4 5

SQL> select * from table(fn_split('1,2,3,4。5','。'));

COLUMN_VALUE ------------------------------------ 1,2,3,4 5

转自https://blog.csdn.net/wanglilin/article/details/7231712

相关文章:http://www.anbob.com/archives/221.html

                 https://blog.csdn.net/mchdba/article/details/51946573

猜你喜欢

转载自blog.csdn.net/BingoXing/article/details/82499788