(どちらのIN
ANY
「オペレーター」です。 「構成」または「構文要素」。)
論理的に 、マニュアルの引用:
IN
= ANY
と同等です 。
ただし、構文のバリエーションは2つあります。 IN
の およびANY
の2つのバリアント 。詳細:
- RailsのWHERE句でINの代わりにANYを使用するにはどうすればよいですか?
IN
セットを取得する = ANY
と同等です セットを取る 、ここに示されているように:
- postgreSQL-in vs any
しかし、それぞれの2番目のバリアントは他と同等ではありません。 ANY
の2番目のバリアント コンストラクトは配列を取ります (実際の配列型である必要があります)一方、IN
の2番目のバリアント カンマで区切られた値のリストを取ります 。これにより、値の受け渡しにさまざまな制限が生じ、できます また、特別な場合には異なるクエリプランにつながります:
- インデックスは
=any()
では使用されません ただし、in
で使用されます - 複数の値のセットまたは配列を関数に渡します
- 複合型の配列内の要素を一致させる方法は?
ANY
より用途が広い
ANY
コンストラクトは、=
だけでなく、さまざまな演算子と組み合わせることができるため、はるかに用途が広いです。 。例:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
多数の値の場合、セットを提供します それぞれのスケーリングが向上します:
- 大きなINを使用してPostgresクエリを最適化する
関連:
- PostgreSQLは配列列にインデックスを付けることができますか?
反転/反対/除外
"id
がある行を検索する 指定された配列にあります」:
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
反転: "id
の行を検索 ない 配列内」:
SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}'); -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));
3つすべてに相当します。最初は配列コンストラクターを使用し、他の2つは配列リテラルを使用します。データ型は、コンテキストから明確に導き出すことができます。それ以外の場合は、'{1,2}'::int[]
のように明示的なキャストが必要になる場合があります 。
id IS NULL
の行 これらの式のいずれも渡さないでください。 NULL
を含めるには 追加の値:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;