PostgreSQLのIN演算子とANY演算子 質問する

PostgreSQLのIN演算子とANY演算子 質問する

PostgreSQL のINand演算子の違いは何ですか?両方の動作メカニズムは同じようです。誰か例を挙げて説明できますか?ANY

ベストアンサー1

(厳密に言えば、INおよびANYは「演算子」ではなく、Postgres の「構成要素」または「構文要素」です。)

論理的にはマニュアルを引用する:

INは と同等です= ANY

しかし、 には 2 つの構文バリエーションがありIN、 には 2 つのバリエーションがありますANY。詳細:

IN ここで示すように、セットを取ることはセットを= ANY取ることと同じです。

しかし、それぞれの 2 番目のバリアントは微妙に異なります。ANY構造の 2 番目のバリアントは配列(実際の配列型である必要があります) を受け取りますが、 の 2 番目のバリアントはコンマで区切られた値のリストINを受け取ります。これにより、値を渡す際の制限が異なり、特殊なケースではクエリ プランも異なる場合があります。

ANYより汎用性が高い

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

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

値の数が多い場合は、セットを提供すると、それぞれに対してより適切なスケーリングが行われます。

関連している:

反転 / 反対 / 排除

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つはすべて同等です。ARRAYコンストラクタ、他の2人は配列リテラル型指定のない配列リテラルの型は、左側の (既知の) 要素型から派生します。
その他の構成 (型指定のある配列値 / 別の型が必要な場合 / デフォルト以外の型の ARRAY コンストラクター) では、明示的にキャストする必要がある場合があります。

行はid IS NULLこれらの式のいずれにも合格しません。NULL値を追加で含めるには、次の手順を実行します。

SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;

おすすめ記事