2016-09-19 4 views
0

で配列の値を選択する -は、私は配列フィールドで、次の値でPostgresのテーブルを持つIN句

enter image description here

私はfield列にid値を持つすべての行を引きたいとここでは私が試したクエリです(テーブルエイリアスで簡略化しました):

SELECT tb1."id", 
     tb1."field", 
     tb1."field1" 
FROM "polls_nullableintegerarraymodel" tb1 
WHERE tb1."field" IN (ARRAY[tb1."id"]) 

しかし、何らかの理由で値を取得しません。

+0

質問を読むにはさまざまな方法があります。どうか明らかにしてください。スクリーンショットとしてではなく*テキスト*としてデータを提供する。あなたのPostgresのバージョンとテーブル定義を提供し、そのサンプルを意味のあるものにし、期待される結果を追加してください。 –

答えて

2

私はこのような何かを期待しています:

SELECT am."id", am."field", am."field1" 
FROM "polls_nullableintegerarraymodel" am 
WHERE am."id" = ANY(am."field"); 

また、テーブルの別名を書くのは読みするクエリがはるかに簡単に作る方法に注意してください。

EDIT:

ここでは、この作業を示すサンプルコードは、次のとおり

with t as (
     select 1 as id, '{2}'::integer[] as field1 union all 
     select 2 as id, '{1, 2}':: integer[] as field1 
    ) 
select * 
from t 
where id = any(field1); 

にのみ第二の行を返します。

EDIT II:

SELECT tb1."id", tb1."field", tb1."field1" 
FROM "polls_nullableintegerarraymodel" tb1 
WHERE tb1."field" <@ (SELECT array_agg("id") FROM tb1); 

これはおそらくあなたが望むものを達成するための簡単な方法ですが、これはあなたがしようとしているもののように見える:

あなたはこれをしたいように見えます。あなたのコメントによると

+0

- そのクエリを試しても動作しません。 – user1050619

+0

私の要件は少し異なります。配列フィールドにid値が含まれているかどうかを確認したい。別名で更新されました。 – user1050619

+0

それは意味をなさない。 'id'は数値であり、配列ではありません。 2番目の列は配列です。 –

0

私はarrayfieldは、このクエリはfieldの配列は、から任意のid値が含まれているすべての行を返す任意のid値

が含まれているかどうかを確認したいです同じテーブル(同じ行だけではない):

SELECT * 
FROM polls_nullableintegerarraymodel p1 
WHERE EXISTS (
    SELECT 1 
    FROM polls_nullableintegerarraymodel p2 
    WHERE p2.id = ANY(p1.field) 
    ); 

は、EXISTS式においてANY構築物の使用:

array operators

同じで:

SELECT * 
FROM polls_nullableintegerarraymodel p1 
WHERE field && (ARRAY(SELECT id FROM polls_nullableintegerarraymodel)); 

重複オペレータ&&と簡単で単純ARRAY constructor(より速くarray_agg()を使用します症例)。

しかし、組み立てられた配列が同じように大きくなるため、このバリアントのパフォーマンスが大きなテーブルで悪化することが予想されます。

関連する問題