Oracle DB 11g r2 中是否有内置函数可以将varchar2变量解析为表?与 listagg 或 wm_concat 相反。我发现只有2006年 Tom Kyte 的方法:
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 :(得分:3)
没有
我会略微简化汤姆的方法,但不是很多;你现在也可以使用正则表达式:
select regexp_substr(:txt, '[^,]+', 1, level)
from dual
connect by regexp_substr(:txt, '[^,]+', 1, level) is not null
答案 1 :(得分: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,abcdefghij12345678901234567890';
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
abcdefghij12345678901234567890
PL/SQL procedure successfully completed.