ORACLE PL-SQL How to SPLIT a string and RETURN the list using a Function

你说的曾经没有我的故事 提交于 2020-05-28 09:38:12

问题


How to Split the given String for the given Delimiter.

Ex:

INPUT

String => '1,2,3,4,5' Delimiter => ','

OUTPUT

1 2 3 4 5


回答1:


What about this? The regular expression allows for null list elements too.

SQL> with tbl(str) as (
  2    select '1,2,,4,5' from dual
  3  )
  4  select regexp_substr(str, '(.*?)(,|$)', 1, level, null, 1) element
  5  from tbl
  6  connect by level <= regexp_count(str, ',')+1;

ELEMENT
--------
1
2

4
5

SQL>

See this post for a function that returns a list element: REGEX to select nth value from a list, allowing for nulls




回答2:


I have found my own way to split the given String using a FUNCTION

A TYPE should be declared as belows:

TYPE tabsplit IS TABLE OF VARCHAR2 (50)
                     INDEX BY BINARY_INTEGER;

And the FUNCTION should be written like this:

FUNCTION fn_split (mp_string IN VARCHAR2, mp_delimiter IN VARCHAR2)
    RETURN tabsplit
IS
    ml_point     NUMBER (5, 0) := 1;
    ml_sub_str   VARCHAR2 (50);
    i            NUMBER (5, 0) := 1;
    taboutput    tabsplit;
    ml_count     NUMBER (5, 0) := 0;
BEGIN
    WHILE i <= LENGTH (mp_string)
    LOOP
        FOR j IN i .. LENGTH (mp_string)
        LOOP
            IF SUBSTR (mp_string, j, 1) = mp_delimiter
            THEN
                ml_sub_str := SUBSTR (mp_string, ml_point, j - ml_point);
                ml_point := j + 1;
                i := ml_point;
                i := i - 1;
                taboutput (ml_count) := ml_sub_str;
                ml_count := ml_count + 1;
                EXIT;
            END IF;
        END LOOP;

        i := i + 1;
    END LOOP;

    ml_sub_str := SUBSTR (mp_string, ml_point, LENGTH (mp_string));
    taboutput (ml_count) := ml_sub_str;

    RETURN taboutput;
END fn_split;

This FUNCTION can be used as belows:

DECLARE
    taboutput   tabsplit;
BEGIN
    taboutput := fn_split ('1,2,3,4,5', ',');

    FOR i IN 0 .. taboutput.COUNT - 1
    LOOP
        DBMS_OUTPUT.put_line (taboutput (i));
    END LOOP;
END;


来源:https://stackoverflow.com/questions/32374326/oracle-pl-sql-how-to-split-a-string-and-return-the-list-using-a-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!