値が与えられた配列に存在するかどうかをテストする方法が必要です。これまでのところ、私はこのようなものを思い付いた
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
しかし、私はこれにもっと簡単な方法があるべきだと考え続けています、私はそれを見ることができません。
編集:私はこれを行うことができる気付いた
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
これははるかに優れており、私は十分になると思いますが、他の方法がある場合は共有してください。
ANY
コンストラクト :を使うとより簡単になります。
SELECT value_variable = ANY ('{1,2,3}'::int[])
ANY
の右括弧(括弧内)は、 set(例えば副照会の結果)またはan array のいずれかです。使い方はいくつかあります。
重要な違い: 配列演算子(<@
、@>
など) expectarrayオペランドとしての/ typesおよび GINインデックスまたはGistインデックスのサポート PostgreSQLの標準ディストリビューションでは/ ANY
構文では左オペランドとしてelementtypeが必要で、サポートされません。これらの指標例:
これのどれもNULL
要素のために働きません。 NULL
をテストするには
特定の値が配列に存在しないかどうかをチェックするときは、してはいけません。
SELECT value_variable != ANY('{1,2,3}'::int[])
しかし使用
SELECT value_variable != ALL('{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
は正しい配列にあります。4
が正しい配列に含まれていない場合でも、2番目のクエリはtrue
です。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パーサを渡すために適切なキャストが必要です。これは、join句でarray contains演算子を使用したクエリの例です。
簡単にするために、関連する部分だけをリストします。
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)
解析では列の正確な型を把握するために表定義をフェッチする必要がないため、追加のキャストが必要であると考えています。他の人はこれについてコメントしてください。