2013-07-10 3 views
0

Есть ли встроенная функция в Oracle DB 11g r2, которая может анализировать переменную varchar2 на таблицу? Напротив listagg или wm_concat. Я нашел способ только Том Кайта «s от 2006:Parse varchar2 to table (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

возможно дубликат [Oracle LISTAGG() для запроса использования] (http://stackoverflow.com/questions/13258746/oracle-listagg-for-querying-use) – Ben

ответ

3

No.

Я бы немного упростить метод Тома, но не очень; Теперь вы можете использовать регулярные выражения, а также: решение

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

SQL Fiddle

+0

Спасибо! Я новичок, не могу установить «Этот ответ полезен!». –

2

Бен 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

Спасибо! Я новичок, не могу установить «Этот ответ полезен!». –