245

Postgres 9.0を使用して、特定の配列に値が存在するかどうかをテストする方法が必要です。これまでのところ、私は次のようなものを思いついた:

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

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

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

それで十分だと思います。ただし、他の方法がある場合は、共有してください。

4

7 に答える 7

385

ANY次の構文を使用すると、より簡単になります。

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

の右オペランドANY(括弧の間) は、セット(たとえば、サブクエリの結果)または配列のいずれかです。いくつかの使用方法があります。

重要な違い:配列演算子 ( <@@>、など&&)はオペランドとして配列型を期待し、PostgreSQL の標準配布でGIN または GiST インデックスをサポートしますが、構造体は左オペランドとして要素ANY型を期待し、これらのインデックスをサポートしません。例:

これはNULL要素に対しては機能しません。をテストするにはNULL:

于 2012-06-27T17:37:25.493 に答える
118

私が陥った罠に気をつけてください: 特定の値が配列に存在しないかどうかをチェックするときは、次のことをすべきではありません:

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

しかし使う

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

代わりは。

于 2013-04-12T10:04:51.017 に答える
40

しかし、他の方法がある場合は、共有してください。

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は正しい配列にあります
  • true4が正しい配列に含まれていなくても、2 番目のクエリは であることに注意してください。
  • 3 番目のクエリでは、左側の配列 (つまり4) の値が右側の配列にないため、次の値が返されます。false
于 2014-10-08T20:42:06.100 に答える