Quelle est la différence entre l'opérateur IN
et ANY
dans PostgreSQL?
Le mécanisme de travail des deux semble être le même. Quelqu'un peut-il expliquer cela avec un exemple?
Logiquement , citant le manuel :
IN
est équivalent à _= ANY
_.
Mais il existe deux variantes de syntaxe de IN
et deux variantes de la construction ANY
. Détails:
La variante IN ()
prenant un set est équivalente à = ANY()
prenant un set , comme illustré ici:
Mais la deuxième variante de chacune est not équivalente à l'autre. La deuxième variante de la construction ANY
prend un tablea (il doit s'agir d'un type de tableau réel), tandis que la deuxième variante de IN
prend une liste séparée par des virgules de valeurs. Cela conduit à différentes restrictions dans le passage de valeurs et peut entraîne également différents plans de requête dans des cas particuliers:
=any()
mais utilisé avec in
La construction ANY
est beaucoup plus polyvalente, car elle peut être combinée avec différents opérateurs, pas seulement _=
_. Exemple pour LIKE
:
_SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
_
Pour un grand nombre de valeurs, fournir un set échelles meilleures pour chacune:
Apparenté, relié, connexe:
L'inversion de:
_SELECT * FROM foo WHERE id = ANY (ARRAY[1, 2]);
_
"trouver des lignes où id
est pas dans le tableau" - est:
SELECT * FROM foo WHERE id <> ALL (ARRAY[1, 2]);
Quel est le même que:
SELECT * FROM foo WHERE NOT (id = ANY (ARRAY[1, 2]));
Les lignes avec id IS NULL
ne transmettent aucune de ces expressions. Pour inclure les valeurs NULL
en plus:
SELECT * FROM foo WHERE (id = ANY (ARRAY[1, 2])) IS NOT TRUE;