0

Oracle DB 11g r2中是否有可以将 varchar2 变量解析为表的内置函数?与listaggwm_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必须有更简单的方法。

4

2 回答 2

3

不。

我会稍微简化汤姆的方法,但不会太多;您现在也可以使用正则表达式:

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

SQL小提琴

于 2013-07-10T22:35:58.247 回答
2

Ben 的regexp_substr解决方案通常是首选解决方案。如果您的字符串恰好由有效的 Oracle 标识符组成——它们少于或等于 30 个字符并以字母字符开头,您也可以使用dbms_utility.comma_to_table函数. 但是,鉴于这些限制,通常最好使用通用解决方案。

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.
于 2013-07-10T23:28:34.257 回答