PostgreSQLのIN
and ANY
演算子の違いは何ですか?
両方のメカニズムは同じようです。誰でも例でこれを説明できますか?
PostgreSQLのIN
and ANY
演算子の違いは何ですか?
両方のメカニズムは同じようです。誰でも例でこれを説明できますか?
回答:
(どちらIN
もANY
「演算子」ではありません。「構成」または「構文要素」です。)
論理的には、マニュアルを引用して:
IN
と同等= ANY
です。
しかし、2つのがある構文バリアントのIN
との二つの変種がANY
。詳細:
IN
取ってセットすることと等価である= ANY
取っセットをここに示されたように、:
しかし、それぞれの2番目のバリアントは他のものと同等ではありません。ANY
コンストラクトの2番目のバリアントは配列(実際の配列型でなければなりません)をIN
取りますが、2番目のバリアントは値のコンマ区切りリストを取ります。これにより、値を渡す際にさまざまな制限が発生し、特殊なケースではさまざまなクエリプランが発生する可能性があります。
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つすべて同等。1つ目は配列コンストラクター、もう2つは配列リテラルです。データ型は、コンテキストから明確に導出できます。それ以外の場合、などの明示的なキャストが必要になる場合があり'{1,2}'::int[]
ます。
を含む行はid IS NULL
、これらの式のいずれも渡しません。NULL
さらに値を含めるには:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;
SELECT * from mytable where id in (1, 2, 3)
、常にと同じ行になりSELECT * from mytable where id = ANY('{1, 2, 3}')
ます。
ANY
!=
演算子と組み合わせることはできません。私は、それが文書化されていると思いませんが、ないselect * from foo where id != ANY (ARRAY[1, 2])
と同じではありませんselect * from foo where id NOT IN (1, 2)
。一方、select * from foo where NOT (id = ANY (ARRAY[1, 2]))
期待どおりに動作します。
ANY
と組み合わせることができます!=
。しかし、それだけではありません。上記の章を追加しました。(これ<>
は標準SQLの演算子です!=
NULL
値を含む最後のバージョンはどのように機能しますか?思いWHERE id = ANY (ARRAY[1, 2]) OR id IS NULL;
だけでも同様に動作しますか?
(id = ...) IS NOT TRUE
ため、機能します。結果またはテストに合格します。参照:stackoverflow.com/a/23767625/939860。追加した式は何か他のものをテストします。これは同等ですid = ...
TRUE
FALSE
NULL
WHERE id <> ALL (ARRAY[1, 2]) OR id IS NULL;