web-dev-qa-db-ja.com

値がPostgres配列に存在するか確認する

値が与えられた配列に存在するかどうかをテストする方法が必要です。これまでのところ、私はこのようなものを思い付いた

select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)

しかし、私はこれにもっと簡単な方法があるべきだと考え続けています、私はそれを見ることができません。

編集:私はこれを行うことができる気付いた

select '{1,2,3}'::int[] @> ARRAY[value_variable::int]

これははるかに優れており、私は十分になると思いますが、他の方法がある場合は共有してください。

149
Mike Starov

ANYコンストラクト :を使うとより簡単になります。

SELECT value_variable = ANY ('{1,2,3}'::int[])

ANYの右括弧(括弧内)は、 set(例えば副照会の結果)またはan array のいずれかです。使い方はいくつかあります。

重要な違い: 配列演算子(<@@>など) expectarrayオペランドとしての/ typesおよび GINインデックスまたはGistインデックスのサポート PostgreSQLの標準ディストリビューションでは/ ANY構文では左オペランドとしてelementtypeが必要で、サポートされません。これらの指標例:

これのどれもNULL要素のために働きません。 NULLをテストするには

257

特定の値が配列に存在しないかどうかをチェックするときは、してはいけません。

SELECT value_variable != ANY('{1,2,3}'::int[])

しかし使用

SELECT value_variable != ALL('{1,2,3}'::int[])

代わりに。

70
murison

他にも方法がある場合は共有してください。

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番目と2番目のクエリでは、値1は正しい配列にあります。
  • 4が正しい配列に含まれていない場合でも、2番目のクエリはtrueです。
  • 3番目のクエリでは、左側の配列(つまり4)の値が右側の配列にないため、falseが返されます。
21
vol7ron

unnestも使用できます。これは、配列を行の集合に拡張してから、単に値が存在するかどうかをチェックするだけで、INまたはNOT INを使用するのと同じくらい簡単です。

例えば.

  1. id => uuid

  2. exception_list_ids => uuid []

select * from table where id NOT IN (select unnest(exception_list_ids) from table2)

2
pg2286

配列内の要素の存在を探すとき、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)

解析では列の正確な型を把握するために表定義をフェッチする必要がないため、追加のキャストが必要であると考えています。他の人はこれについてコメントしてください。

0
Kemin Zhou