2013-07-10 62 views
0

是否有內置函數Oracle DB 11g r2可以將varchar2變量解析爲表? listaggwm_concat的對面。我發現只有湯姆凱特的方法,於2006年:將表varchar2解析爲表(Oracle)

with data as 
(
select trim(substr (txt, instr(txt, ',', 1, level) + 1 
     , instr(txt, ',', 1, level + 1) - instr(txt, ',', 1, level) - 1)) as token 
from (select ',' || :txt || ',' txt from dual) 
connect by level <= length(:txt) - length(replace(:txt, ',', '')) + 1 
) 
select * from data; 

我認爲Oracle必須有更簡單的方法。

+0

[查詢使用甲骨文LISTAGG()的可能重複(http://stackoverflow.com/questions/13258746/oracle-listagg-for-querying-use) – Ben

回答

3

我會簡化湯姆的方法,但不是太多;您現在可以使用正則表達式,以及:

select regexp_substr(:txt, '[^,]+', 1, level) 
    from dual 
connect by regexp_substr(:txt, '[^,]+', 1, level) is not null 

SQL Fiddle

+0

謝謝!我是新手,無法設置「這個答案很有用!」。 –

2

Ben的regexp_substr解決方案通常是首選的解決方案。如果您的字符串碰巧包含有效的Oracle標識符的字符串 - 它們少於或等於30個字符並以字母字符開頭,那麼您還可以使用dbms_utility.comma_to_table function。但是,鑑於這些限制,通常使用通用解決方案會更好。

SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2 l_string varchar2(1000) := 'foo,bar,b123,FuzzyBunny,abcdefghij123456789'; 
    3 l_num pls_integer; 
    4 l_arr dbms_utility.uncl_array; 
    5 begin 
    6 dbms_utility.comma_to_table(l_string, l_num, l_arr); 
    7 for i in 1..l_arr.count 
    8 loop 
    9  dbms_output.put_line(l_arr(i)); 
10 end loop; 
11* end; 
SQL>/
foo 
bar 
b123 
FuzzyBunny 
abcdefghij123456789

PL/SQL procedure successfully completed. 
+0

謝謝!我是新手,無法設置「這個答案很有用!」。 –