web-dev-qa-db-fra.com

IN vs ANY opérateur dans PostgreSQL

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?

77
mrg

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:


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:

Inversion/contraire/exclusion

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;
99
Erwin Brandstetter