web-dev-qa-db-ja.com

PostgreSQLのIN対ANY演算子

PostgreSQLのINANY演算子の違いは何ですか?
両方の動作メカニズムは同じようです。誰もこれを例で説明できますか?

63
mrg

論理的にマニュアルを引用

IN= ANYと同等です。

ただし、INの2つのsyntax variantと、ANYコンストラクトの2つのvariantがあります。詳細:

IN ()バリアントsetを取得は、以下に示すように、setを取得する= ANY()と同等です。

ただし、それぞれの2番目のバリアントはnotと同等ですです。 ANY構造の2番目のバリアントはarray(実際の配列型である必要があります)を取り、INの2番目のバリアントはコンマ区切りの値のリストを取ります。これにより、値の受け渡しにさまざまな制限が生じ、canは特別な場合にさまざまなクエリプランにもつながります。


ANY構文は、=だけでなく、さまざまな演算子と組み合わせることができるため、はるかに用途が広くなります。 LIKEの例:

SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');

多数の値の場合、setを指定すると、それぞれのスケールが向上します。

関連:

反転/反対/除外

以下の反転:

SELECT * FROM foo WHERE id = ANY (ARRAY[1, 2]);

"idが配列内のnotである行を検索する"-は次のとおりです。

SELECT * FROM foo WHERE id <> ALL (ARRAY[1, 2]);

これは次と同じです:

SELECT * FROM foo WHERE NOT (id = ANY (ARRAY[1, 2]));

id IS NULLの行は、これらの式のいずれも渡しません。 NULL値をさらに含めるには:

SELECT * FROM foo WHERE (id = ANY (ARRAY[1, 2])) IS NOT TRUE;
83