2

そのため、テーブルを作成または編集することはできません (私は読み取り専用権限を持つユーザーです)。10,000 個の一意の ID を検索したいと考えています。Oracle は 1000 を超えるアイテムを制限しているため、IN() ステートメント内にそれらを配置することはできません。

Oracle の DUAL テーブルからこのリスト全体を選択することは可能ですか? 何かのようなもの:

select  
'id123,id8923,id32983,id032098,id308230,id32983289'  
from DUAL
4

4 に答える 4

6

コレクションを使用します (IN句のように 1000 項目に限定されません)。

SELECT COLUMN_VALUE AS id
FROM   TABLE(
         SYS.ODCIVARCHAR2LIST(
           'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
         )
       )

SYS.ODCIVARCHAR2LISTおよびは、スキーマSYS.ODCINUMBERLISTで提供されるコレクション型です。SYS

SELECTテーブルを使用する必要なく、これをどのテーブルからでも直接結合できDUALます。

SELECT y.*
FROM   your_table y
       INNER JOIN TABLE(
         SYS.ODCIVARCHAR2LIST(
           'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
         )
       ) i
       ON (y.id = i.COLUMN_VALUE);

コレクション型を作成できる場合は、式は必要なく、演算子を使用して句TABLEで直接使用できます。WHEREMEMBER OF

CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(200);
/
SELECT *
FROM   yourtable
WHERE  id MEMBER OF stringlist(
                      'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
                    );

値をバインドパラメータとして渡すこともできます -ここで私の答えを見てください

于 2016-12-15T09:48:58.667 に答える
2

Oracle はまだ行コンストラクターをサポートしていないため、VALUES回避策が 2 つしかありません。

1000 項目の制限は、複数列の IN 条件には適用されません

式リスト

コンマで区切られた式のリストには、1000 個を超える式を含めることはできません。式のセットのカンマ区切りのリストには、任意の数のセットを含めることができますが、各セットに含めることができる式は 1000 個までです。

あなたができるように:

where (1,id) in ( (1,'id123'),
                  (1,'id8923'),
                  (1,'id32983'), 
                  (1,'id032098'), .... )

または、大きく醜い UNION ALL を使用します。

with idlist (xid) as (
  select 'id123' from dual union all 
  select 'id8923' from dual union all 
  .....
  select 'id32983' from dual 
)
select ...
from some_table
where id in (select xid from idlist);
于 2016-12-15T07:16:03.360 に答える
0

さらに別の回避策

select  *

from    t

where   id in ('id1','id2','id3',...,'id1000')
     or id in ('id1001','id1002','id1003',...,'id2000')
     or id in ('id2001','id2002','id2003',...,'id3000')
     or ...
于 2016-12-15T08:22:27.643 に答える
0

1 つの解決策は、WITH 句です。

with ids as (
   select 'id123' as uid from dual union all
   select 'id8923' as uid from dual union all
   select 'id32983' as uid from dual union all
   select 'id032098' as uid from dual union all
   select 'id308230' as uid from dual union all
   select 'id32983289' as uid from dual 
)
select *
from ids
     join your_table yt
     on yt.id = ids.uid  

これは少し面倒に思えるかもしれませんが、スプレッドシートなどに UID のリストがあると思います。そうであれば、正規表現を使用してこれらの select ステートメントを生成するのは簡単です。正規表現の検索と置換をサポートするエディターに列をカット アンド ペーストするだけです。

于 2016-12-15T07:16:22.810 に答える