0

varchar2 変数をテーブルに解析できるOracle DB 11g r2の組み込み関数はありますか? 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;

オラクルにはもっと簡単な方法があるはずだと思います。

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 に答える