2015-12-15 67 views
0

不規則的字符串我有數據,並有類似的問題這個問題:Parsing pipe delimited string into columns?解析管道分隔,在Oracle

但是我的數據可以包含沒有數據,或者說是不完整的串子串。請注意5個值是最大值。除非字符串有5個值,否則上述問題的解決方案將失敗。請看下圖:

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

什麼是你想要的輸出?一行五列?在0行和5行之間有兩列?還有別的嗎?我不確定你在嘗試什麼,可能是'regexp_substr'和什麼「失敗」。 –

+0

我需要將分隔符上的值列拆分爲5列。 '根據標準,'dual'選擇regexp_substr('val1 | val2 ||| val5','[^ |] +',1,3)將產生'val5',因爲它是第三個值。我的目標是將這些數據轉移到一個有目的的表格中。 –

+0

如果你將它編輯到你的問題中(這是你正在使用的代碼和你想要輸入數據的輸出),這將會很有幫助。 –

回答

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        
+0

謝謝,這似乎工作。你能幫我理解你對比賽和次表達參數以及第二個捕獲組的使用嗎?爲什麼沒有一個'以|結束|'以同樣的方式工作? –

+1

要匹配'||'之間的空字符串,您需要從'[^ |] +'更改爲零寬度匹配'[^ |] *'。然而,當你有'| val |' - 與'val'匹配,然後在分隔符之前出現不需要的零寬度匹配時,這會產生兩個匹配的副作用;爲了解決這個問題,你需要確保你在匹配'[^ |] * \ |'中包含分隔符,但是它不會匹配最後一個值,所以你需要匹配分隔符或者字符串末尾'[[^|] *(\ $ ||)'。它給你你想要的,但包括分隔符,所以你可以使用捕獲組來提取所需的值'([^ |] *)(\ || $)''。 – MT0

1

如果使用PL/SQL和循環是OK,你可以使用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;