PostgreSQL のIN
and演算子の違いは何ですか?両方の動作メカニズムは同じようです。誰か例を挙げて説明できますか?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;