sql >> Base de Datos >  >> RDS >> PostgreSQL

IN vs CUALQUIER operador en PostgreSQL

(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 con in
  • 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;