2017-09-29 12 views
2

でCTEの配列を使用するCTEでIDの配列を1度作成し、複数のANYで使用したいとします。しかし、私は最初のもので立ち往生している。 PGの使用930SELECT ... WHERE ... ANY

WITH x AS (
    SELECT ARRAY(SELECT * FROM generate_series(1, 10)) AS a 
) 
SELECT 1 
WHERE 2 = ANY(SELECT a FROM x) 

私が期待しているのは、ANYのSELECT文が以前に作成された配列を返すということです。代わりに、私はこのエラーを取得する:

ERROR: operator does not exist: integer = integer[]

LINE 6: WHERE 2 = ANY(SELECT a FROM x)

私はselect文配列を返す必要がありますし、ANY 配列がかかるため、問題が何であるかを理解していません。

もちろん、CTEで配列を作成し、それをいつでもANYで作成することはできませんが、一度作成するよりパフォーマンスが低いと想定します。配列を持たないANYではクエリプラン(この小さな例ではなく実際のテーブルでこれを行うとき)がパフォーマンスの低いものに変わるため、配列が必要です。

+1

を使用したい場合は、 'ANY'はすべて、右の配列を返す場合。しかし、 '2'は本当に' 'integer []'か、単純で単純な '' integer''ですか? – waka

+0

なぜこのための配列を使いたいのですか?単純なサブクエリは、標準のSQLメソッドです。 –

+0

@ GordonLinoff私は上記のとおり、私は標準的なサブクエリと配列との別のクエリプランを取得し、配列計画が優れています。 – eurotrash

答えて

1

ANYには2つの形式があります。あなたはANY(array expression):

WITH x AS (
    SELECT ARRAY(SELECT * FROM generate_series(1, 10)) AS a 
) 

SELECT 1 
FROM x 
WHERE 2 = ANY(a) 

を使用する場合、またはあなたがANY(subquery):

WITH x AS (
    SELECT * FROM generate_series(1, 10) AS a 
) 

SELECT 1 
WHERE 2 = ANY(SELECT a FROM x) 
+0

Duh!最初のものはまさに私がやろうとしていたものです...ありがとう! – eurotrash

0

配列を使用していないこれを行うため、通常のSQL方法:

もちろん
WITH x AS (
     SELECT gs.a 
     FROM generate_series(1, 10)) AS gs(a) 
    ) 
SELECT 1 
WHERE 2 IN (SELECT a FROM x); 

、あなたは(そのようなアレイについての学習など)さまざまな理由でアレイを用いたことにしたいかもしれません。しかし、この問題を解決するSQLの方法を最低限理解しておく必要があります。

+0

私はこの方法を理解していますが、私の実際のデータで使用するときは 'ANY(my array) 'を使うよりパフォーマンスが劣ります。とにかく、私はそこに2つ以上の値を取得すると、いつも 'IN'が' ANY'に変更されますが、ANYが配列とテーブル/行のセットで使用されると、プランは大きく変化します。 – eurotrash