(Ni IN
ni ANY
es un "operador". Una "construcción" o "elemento de sintaxis".)
Lógicamente , citando el manual:
IN
es equivalente a = ANY
.
Pero hay dos variantes de sintaxis de IN
y dos variantes de ANY
. Detalles:
- ¿Cómo usar ANY en lugar de IN en una cláusula WHERE con Rails?
IN
tomando un conjunto es equivalente a = ANY
tomando un conjunto , como se demuestra aquí:
- postgreSQL - en vs cualquiera
Pero la segunda variante de cada uno no es equivalente al otro. La segunda variante de ANY
la construcción toma una matriz (debe ser un tipo de matriz real), mientras que la segunda variante de IN
toma una lista de valores separados por comas . Esto conduce a diferentes restricciones en el paso de valores y can también conducen a diferentes planes de consulta en casos especiales:
- Índice no usado con
=any()
pero se usa conin
- Pasar múltiples conjuntos o matrices de valores a una función
- ¿Cómo hacer coincidir elementos en una matriz de tipo compuesto?
ANY
es más versátil
El ANY
construct es mucho más versátil, ya que se puede combinar con varios operadores, no solo =
. Ejemplo:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Para una gran cantidad de valores, proporcionar un conjunto se escala mejor para cada uno:
- Optimización de una consulta de Postgres con un IN grande
Relacionado:
- ¿Puede PostgreSQL indexar columnas de matrices?
Inversión / opuesto / exclusión
"Buscar filas donde id
está en la matriz dada":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inversión:"Buscar filas donde id
es no en la matriz":
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}'));
Los tres equivalentes. El primero con constructor de matriz, los otros dos con literal de matriz. El tipo de datos se puede derivar del contexto sin ambigüedades. De lo contrario, es posible que se requiera una conversión explícita, como '{1,2}'::int[]
.
Las filas con id IS NULL
no pase ninguna de estas expresiones. Para incluir NULL
valores adicionales:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;