Condición IN
Una condición IN prueba un valor para la membresía en un conjunto de valores o en una subconsulta.
Sintaxis
expression [ NOT ] IN (expr_list | table_subquery)
Argumentos
- expresión
-
Expresión temporal, de carácter o numérica que se compara con expr_list (lista_de_expresiones) o table_subquery (subconsulta_de_tabla) y debe ser compatible con el tipo de datos de esa lista o subconsulta.
- expr_list (lista_de_expresiones)
-
Una o más expresiones separadas por comas o uno o más conjuntos de expresiones separados por comas entre paréntesis.
- table_subquery (subconsulta_de_tabla)
-
Una subconsulta que toma el valor de una tabla con una o más filas, pero está limitada a una columna en su lista selecta.
- IN | NOT IN
-
IN devuelve true si la expresión es un miembro de la consulta o lista de expresiones. NOT IN devuelve true si la expresión no es un miembro. IN y NOT IN devuelven NULL y no devuelven filas en los siguientes casos: si la expresión genera un valor nulo o si no hay valores de expr_list o table_subquery que coincidan y al menos una de estas filas de comparación genera un valor nulo.
Ejemplos
Las siguientes condiciones son true solo para esos valores enumerados:
qtysold in (2, 4, 5) date.day in ('Mon', 'Tues') date.month not in ('Oct', 'Nov', 'Dec')
Optimización para listas IN grandes
Para optimizar el rendimiento de la consulta, una lista IN que incluye más de 10 valores se evalúa internamente como una matriz escalar. Las listas IN con menos de 10 valores se evalúan como una serie de predicados OR. Esta optimización se admite para los tipos de datos SMALLINT, INTEGER, BIGINT, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP y TIMESTAMPTZ.
Observe el resultado de EXPLAIN de la consulta para ver el efecto de esta optimización. Por ejemplo:
explain select * from sales QUERY PLAN -------------------------------------------------------------------- XN Seq Scan on sales (cost=0.00..6035.96 rows=86228 width=53) Filter: (salesid = ANY ('{1,2,3,4,5,6,7,8,9,10,11}'::integer[])) (2 rows)