4

基本的に、私の問題は、値の静的リストを結合するクエリをOracleで実行する必要があることです(「静的」は、データベースから取得できない他の場所から取得されたことを意味しますが、実際にはプラグインする値の任意のリストですクエリから返された値の動的リストを使用します。

したがって、私の最初のクエリは次のようになります。

select * from (select ('18776') as instanceid from dual) union (<more complex query>)

万歳!そして、静的な値のより長いリストでそれを実行してみてください。結局のところ、実行しようとすると「右括弧がありません」というメッセージが表示されます。

select ('18776','18775') as instanceid from dual

したがって、私の基本的な問題は、静的値のリストをこのユニオンに統合するにはどうすればよいですか?

注:これは、問題の単純化された例です。実際のリストは、クエリを生成する前に API から生成されるため、この "静的" 値のリストは予測できないほど大きくなります。私は2つの静的な値だけを扱っているのではなく、任意のリストです。

4

3 に答える 3

8
select '18776' as instanceid from dual union all
select '18775' as instanceid from dual 

また

select column_value from table(sys.odcivarchar2list('18776', '18775'))

または、カンマ区切りの文字列を取り、それを一連の varchars に分割できる、ある種の階層クエリ。

これらを最初のクエリに結合します。

更新:「私は 2 つの静的な値だけを扱っているわけではありません。これは任意のリストです。」

コレクションとしてクエリに渡すこともできます (以下は、考えられる多くのアプローチの 1 つにすぎません)。

23:15:36 LKU@sandbox> ed
Wrote file S:\spool\sandbox\BUFFER_LKU_39.sql

  1  declare
  2    cnt int := 10;
  3    coll sys.odcivarchar2list := sys.odcivarchar2list();
  4  begin
  5    coll.extend(cnt);
  6    for i in 1 .. cnt loop
  7      coll(i) := dbms_random.string('l', i);
  8    end loop;
  9    open :result for 'select * from table(:c)' using coll;
 10* end;
23:37:03  11  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.50
23:37:04 LKU@sandbox> print result

COLUMN_VALUE
-------------------------------------------------------------
g
kd
qdv
soth
rvwnq
uyfhbq
xxvxvtw
eprralmd
edbcajvfq
ewveyljsjn

10 rows selected.

Elapsed: 00:00:00.01
于 2013-09-11T15:09:36.963 に答える
2

2 つのサブクエリに分割したいと思います。

select *
from ((select '18776' as instanceid from dual) 
      union
      (select '18775' as instanceid from dual) 
      union
      (<more complex query>)
     ) t;

union allよりも優れたパフォーマンスを発揮することに注意してくださいunion。重複がない(または重複が問題にならない)ことがわかっている場合は、union all代わりに使用してください。

于 2013-09-11T15:10:37.010 に答える
1

テーブル タイプを作成する能力/権限がある場合は、次の操作を実行できます。

CREATE OR REPLACE 
TYPE TYP_NUMBER_TABLE AS TABLE OF NUMBER(11);

次に、TABLE 関数を使用して、SQL でオンザフライで初期化するその型のインスタンスから選択できます。

SELECT COLUMN_VALUE FROM TABLE(TYP_NUMBER_TABLE(1, 2, 3));

結果:

COLUMN_VALUE
------------
           1
           2
           3
于 2013-09-12T01:11:06.587 に答える