【问题标题】:ORACLE PL-SQL How to SPLIT a string and RETURN the list using a FunctionORACLE PL-SQL 如何使用函数拆分字符串并返回列表
【发布时间】:2015-11-29 05:04:30
【问题描述】:

如何为给定的分隔符拆分给定的字符串。

例如:

输入

字符串 => '1,2,3,4,5' 分隔符 => ','

输出

1 2 3 4 5

【问题讨论】:

    标签: string function plsql split tokenize


    【解决方案1】:
    SELECT LEVEL AS id, REGEXP_SUBSTR('A,B,C,D', '[^,]+', 1, LEVEL) AS data
       FROM dual
    CONNECT BY REGEXP_SUBSTR('A,B,C,D', '[^,]+', 1, LEVEL) IS NOT NULL;
    

    【讨论】:

    • 嗨,马杜卡。此答案已出现在低质量队列中,因为它应该提供有关代码为什么和/或如何回答问题以提高其长期价值的额外上下文。亲切的问候。
    【解决方案2】:

    这个呢?正则表达式也允许空列表元素。

    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>
    

    有关返回列表元素的函数,请参阅此帖子:REGEX to select nth value from a list, allowing for nulls

    【讨论】:

    • 这很酷..如果你可以把它放在一个函数中,那将非常有用..感谢您的解决方案
    • 我更新了这篇文章,其中包含一个指向上一篇文章的链接,其中我展示了一个返回列表元素的函数。它基本上是您正在寻找的。​​span>
    【解决方案3】:

    我找到了自己的方法来使用函数拆分给定的字符串

    类型应该声明如下:

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

    而FUNCTION应该这样写:

    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;
    

    这个函数可以如下使用:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2012-06-15
      • 2013-05-11
      • 2019-06-13
      • 2013-02-05
      • 2021-01-06
      相关资源
      最近更新 更多