web-dev-qa-db-ja.com

Oracleの値のリストから選択する方法

私はこれを参照していますstackoverflow回答:

SQL Serverの値のリストから選択する方法

Oracleで同様のことができますか?

このページでUNIONを使用する他の回答を見ましたが、この方法は技術的には機能しますが、私の場合は使用したいものではありません。

だから、多かれ少なかれコンマで区切られた値のリストのように見える構文にとどまりたい。

[〜#〜] update [〜#〜]create type tableanswer =

私はテーブルを持っています:

CREATE TABLE "BOOK" 
(   "BOOK_ID" NUMBER(38,0)
)

このスクリプトを使用しますが、BOOKテーブルに行を挿入しません。

create type number_tab is table of number;

INSERT INTO BOOK (
    BOOK_ID
)
SELECT A.NOTEBOOK_ID FROM
    (select column_value AS NOTEBOOK_ID from table (number_tab(1,2,3,4,5,6))) A
;

スクリプト出力:

TYPE number_tab compiled
Warning: execution completed with warning

しかし、このスクリプトを使用すると、BOOKテーブルに新しい行が挿入されます。

INSERT INTO BOOK (
    BOOK_ID
)
SELECT A.NOTEBOOK_ID FROM
    (SELECT (LEVEL-1)+1 AS NOTEBOOK_ID FROM DUAL CONNECT BY LEVEL<=6) A
;
44
rapt

ストアド型を作成する必要はありません。Oracleの組み込みコレクション型を評価できます。

select distinct column_value from table(sys.odcinumberlist(1,1,2,3,3,4,4,5))
64
be here now

値のコンマ区切りリストを変換する場合:

select column_value 
from table(sys.dbms_debug_vc2coll('One', 'Two', 'Three', 'Four'));

-- Or

select column_value 
from table(sys.dbms_debug_vc2coll(1,2,3,4));

コンマで区切られた値の文字列を変換する場合は、Justin Caveの正規表現SQLソリューションをお勧めします。

47
Wolf

コンマ区切りのリストを取得して、データの複数の行に解析するさまざまな方法があります。 SQLで

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select '1,2,3,a,b,c,d' str from dual
  3  )
  4   select regexp_substr(str,'[^,]+',1,level) element
  5     from x
  6* connect by level <= length(regexp_replace(str,'[^,]+')) + 1
SQL> /

ELEMENT
----------------------------------------------------
1
2
3
a
b
c
d

7 rows selected.

またはPL/SQLで

SQL> create type str_tbl is table of varchar2(100);
  2  /

Type created.

SQL> create or replace function parse_list( p_list in varchar2 )
  2    return str_tbl
  3    pipelined
  4  is
  5  begin
  6    for x in (select regexp_substr( p_list, '[^,]', 1, level ) element
  7                from dual
  8             connect by level <= length( regexp_replace( p_list, '[^,]+')) + 1)
  9    loop
 10      pipe row( x.element );
 11    end loop
 12    return;
 13  end;
 14
 15  /

Function created.

SQL> select *
  2    from table( parse_list( 'a,b,c,1,2,3,d,e,foo' ));

COLUMN_VALUE
--------------------------------------------------------------------------------
a
b
c
1
2
3
d
e
f

9 rows selected.
5
Justin Cave

あなたはこれを行うことができます:

create type number_tab is table of number;

select * from table (number_tab(1,2,3,4,5,6));

列にはOracleによってCOLUMN_VALUEという名前が付けられているため、これも機能します。

select column_value from table (number_tab(1,2,3,4,5,6));
4
Tony Andrews

こんにちは、XML-Tableの文字列でも可能です

SELECT trim(COLUMN_VALUE) str FROM xmltable(('"'||REPLACE('a1, b2, a2, c1', ',', '","')||'"'));
3
SkateScout

Oracle 12.2以降では、TABLE関数は不要で、組み込みのコレクションから直接選択できます。

SQL> select * FROM sys.odcinumberlist(5,2,6,3,78);

COLUMN_VALUE
------------
           5
           2
           6
           3
          78

SQL> select * FROM sys.odcivarchar2list('A','B','C','D');

COLUMN_VALUE
------------
A
B
C
D
0
Kaushik Nayak