【问题标题】:split string into multiple rows with multiple columns将字符串拆分为多行多列
【发布时间】:2015-07-16 00:15:11
【问题描述】:

我有一个包含用户信息的字符串。我必须编写一个函数,将字符串作为输入并插入到某个表中。

输入字符串包含多行多列,如下所示:

inputString= "1,cassey,1222,12-12-12:2,timon,,02-02-12:3,john,3333,03-03-12"

我想要的是从中创建插入...

如何实现?

【问题讨论】:

标签: oracle insert string regex


【解决方案1】:

单个查询中的解决方案如下: 但我用 'NULL' 替换了 ',,'

inputString= "1,cassey,1222,12-12-12:2,timon,NULL,02-02-12:3,john,3333,03-03-12"

                SELECT REGEXP_SUBSTR (REGEXP_SUBSTR (inputString, '[^:]+', 1, LEVEL), '[^,]+', 1, 1) AS Col1,
                       REGEXP_SUBSTR (REGEXP_SUBSTR (inputString, '[^:]+', 1, LEVEL), '[^,]+', 1, 2) AS Col2,
                       REGEXP_SUBSTR (REGEXP_SUBSTR (inputString, '[^:]+', 1, LEVEL), '[^,]+', 1, 3) AS Col3,
                       REGEXP_SUBSTR (REGEXP_SUBSTR (inputString, '[^:]+', 1, LEVEL), '[^,]+', 1, 4) AS Col4
                  FROM DUAL 
            CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (inputString, '[^:]+')) + 1;

结果:

Col1    Col2    Col3    Col4
------  ------  ------  ------
1       cassey  1222    12-12-12
2       timon   NULL    02-02-12
3       john    3333    03-03-12


3 rows selected.

【讨论】:

    【解决方案2】:

    包装规格:

    创建或替换包 string_conversion AS

    TYPE string_test_tab IS TABLE OF VARCHAR2(2000);

    TAB string_test_tab;

    PROCEDURE string_convert(v_input IN VARCHAR2, v_output OUT string_test_tab);

    END string_conversion;

    /

    包体:

    创建或替换包体 string_conversion AS

    PROCEDURE string_convert(v_input IN VARCHAR2, v_output OUT string_test_tab) 是

    v_index NUMBER := 1;
    
    v_index_comma NUMBER := 1;
    
    TAB2 string_test_tab;
    
    v_input_str VARCHAR2(2000):= v_input||',';
    

    开始

    v_output := string_test_tab();
    
    LOOP
    
      v_index_comma := INSTR (v_input_str, ',',v_index);
    
      EXIT WHEN v_index_comma = 0;
    
      v_output.extend();
    
      v_output(v_output.count):= SUBSTR(v_input_str, v_index, v_index_comma - v_index);
    
      dbms_output.put_line(v_output(v_output.count));
    
      v_index := v_index_comma + 1; 
    
    END LOOP;
    

    END string_convert;

    END string_conversion;

    /

    测试:

    声明

    v_out1 string_conversion.string_test_tab;

    开始

    string_conversion.string_convert('a,b,c,d,e',v_out1);

    FOR j IN v_out1.FIRST .. v_out1.LAST

    循环

      dbms_output.put_line(v_out1(j));
    

    结束循环;

    结束; /

    输出:

    一个

    b

    c

    d

    e

    【讨论】:

    • 你能不能再补充一些解释?
    • string_test_tab 是一个 PLSQL 表,创建 string_test_tab 类型的表 "TAB"。如果 Input(v_input) 是 "a,b,c,d,e" 那么 v_input_str 的值将是 "a, b,c,d,e," 通过 string_test_tab 类型的变量 v_output 存储和返回输出。 v_index_comma 用于获取逗号的索引(位置)。 extend() 用于通过 v_ouput 在 PLSQL 表中追加(添加)行。 (v_ouput.count) 将获取 PLSQL 表中的行数。 SUBSTR 乐趣。将从 v_input 获取字母并将其添加到 PLSQL 表中,循环继续直到 v_index_comma 的值变为零
    【解决方案3】:
    DECLARE
    
    v_string VARCHAR2(20) := 'a,b,c,d,e';
    
    v_val VARCHAR2(2000);
    
    BEGIN
    
      dbms_output.put_line('v_string = '||v_string);
    
    LOOP
    
        v_val := SUBSTR(v_string,1, INSTR(v_string, ',', 1)-1);
    
        IF INSTR(v_string, ',', 1) = 0 THEN
    
          v_val := v_string;
    
        END IF;
    
        dbms_output.put_line(v_val);
    
        EXIT WHEN INSTR(v_string, ',', 1) = 0;
    
        v_string := SUBSTR(v_string,INSTR(v_string, ',', 1)+1);
    
    END LOOP;
    
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多