在Oracle中解析管道分隔,不规则的字符串

时间:2015-12-15 16:12:32

标签: regex oracle

我对此问题有数据和类似问题:Parsing pipe delimited string into columns?

但是我的数据可以包含没有数据的子字符串或不完整的字符串。请注意,5个值是最大值。除非字符串有5个值,否则上述问题中的解决方案将失败。见下文:

KEY         VALUE                               
----        -------------------
00          val1||||val5                                
01          val2|val2|val3|                        
02          val1|val2||val4

2 个答案:

答案 0 :(得分:1)

如果使用PL / SQL并且循环正常,则可以使用apex_util.string_to_table:

declare
   l_tab apex_application_global.vc_arr2;
begin
   for r in (select key, value from mytable) loop
      l_tab := apex_util.string_to_table (r.value, '|');
      dbms_output.put_line ('key='||r.key);
      for i in 1..l_tab.count loop
         dbms_output.put_line ('value ' || i || '='||l_tab(i));
      end loop;
   end loop;
end;

答案 1 :(得分:1)

<强>设置

CREATE TABLE TABLE_NAME ( KEY, VALUE ) AS
SELECT '00',          'val1||||val5' FROM DUAL UNION ALL
SELECT '01',          'val2|val2|val3|' FROM DUAL UNION ALL
SELECT '02',          'val1|val2||val4' FROM DUAL;

查询1

SELECT  Key,
        REGEXP_SUBSTR( value, '([^|]*)(\||$)', 1, 1, NULL, 1 ) AS val1,
        REGEXP_SUBSTR( value, '([^|]*)(\||$)', 1, 2, NULL, 1 ) AS val2,
        REGEXP_SUBSTR( value, '([^|]*)(\||$)', 1, 3, NULL, 1 ) AS val3,
        REGEXP_SUBSTR( value, '([^|]*)(\||$)', 1, 4, NULL, 1 ) AS val4,
        REGEXP_SUBSTR( value, '([^|]*)(\||$)', 1, 5, NULL, 1 ) AS val5
FROM    table_name

<强>结果:

KEY VAL1            VAL2            VAL3            VAL4            VAL5          
--- --------------- --------------- --------------- --------------- ---------------
00  val1                                                            val5            
01  val2            val2            val3                                            
02  val1            val2                            val4