回答:
構成を簡単にするANY
:
SELECT value_variable = ANY ('{1,2,3}'::int[])
ANY
(括弧の間の)右側のオペランドは、セット(サブクエリの結果など)または配列のいずれかです。使い方はいくつかあります:
重要な違い:(配列演算子<@
、@>
、&&
。ら)を期待アレイオペランドとしてタイプの支持GINまたはのGiSTインデックスながら、PostgreSQLの標準分布でのANY
構築が期待要素左オペランドとしてタイプし、これらのインデックスをサポートしていません。例:
これはNULL
要素に対しては機能しません。をテストするにはNULL
:
ANY/ALL (array) requires array on right side
、addを実行::int[]
すると魅力的でした。
'something' = ANY(some_array)
はWHERE
節でも使用できることを知っておく必要があります。Cromだけが知っている理由により、ここ4年間、配列コンパレーターをWHERE
句で使用できないと考えていました。その時代はもう過ぎ去りました。(私は子供の頃頭に落ちました、それで私だけかもしれません)。
boolean
表現もこのWHERE
節で機能します-クロムは喜んでいます。
私が入り込んだトラップに注意してください:特定の値が配列に存在しないかどうかをチェックするときは、行うべきではありません:
SELECT value_variable != ANY('{1,2,3}'::int[])
でも使う
SELECT value_variable != ALL('{1,2,3}'::int[])
代わりに。
ALL
vsの使用に注意してくださいANY
SELECT NOT value_variable = ANY('{1,2,3}'::int[])
より読みやすいかもしれません
他に方法がある場合は、共有してください。
2つの配列を比較できます。左の配列の値のいずれかが右の配列の値と重複する場合は、trueを返します。一種のハックですが、機能します。
SELECT '{1}' && '{1,2,3}'::int[]; -- true
SELECT '{1,4}' && '{1,2,3}'::int[]; -- true
SELECT '{4}' && '{1,2,3}'::int[]; -- false
1
は、値は正しい配列にありますtrue
値4
が正しい配列に含まれていない場合でも、2番目のクエリはであることに注意してください。4
)の値は右の配列にないため、次のように返されますfalse
unnest
同様に使用することができます。配列を行のセットに展開し、値が存在するかどうかを確認するのは、IN
またはを使用するのと同じくらい簡単NOT IN
です。
例えば
id => uuid
exception_list_ids => uuid []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
配列内の要素の存在を探す場合、postgresのSQLパーサーを渡すために適切なキャストが必要です。次に、結合句で配列を含む演算子を使用したクエリの例を1つ示します。
簡単にするために、関連する部分のみをリストします。
table1 other_name text[]; -- is an array of text
示されているSQLの結合部分
from table1 t1 join table2 t2 on t1.other_name::text[] @> ARRAY[t2.panel::text]
以下も動作します
on t2.panel = ANY(t1.other_name)
列の正確なタイプを把握するために解析でテーブル定義をフェッチする必要がないため、追加のキャストが必要だと思います。他の人はこれについてコメントしてください。