Saltar a contenido

El operador IN permite verificar si un valor coincide con algún otro en una lista de valores.

Aquí está la sintaxis básica del operador "IN":

valor IN (valor1,valor2,...)

El operador "IN" devuelve verdadero si el "valor" es igual a cualquier valor de la lista, como "valor1" y "valor2".

La lista de valores puede ser una lista de valores literales que incluyen números y cadenas.

Además de los valores literales, el operador "IN" también acepta una lista de valores devueltos por una consulta.

Funcionalmente, el operador IN equivale a combinar múltiples expresiones booleanas con los operadores OR:

valor = valor1 OR valor = valor2 OR ...

Ejemplos del operador IN

Usaremos la tabla film de la base de datos de muestra:

img

Uso del operador IN de PostgreSQL con una lista de números

El siguiente ejemplo utiliza el operador IN para recuperar información sobre la película con id 1, 2 y 3:

SELECT
  film_id, 
  title 
FROM
  film 
WHERE
  film_id in (1, 2, 3);Code language: SQL (Structured Query Language) (sql)

Salida:

 film_id |      title
---------+------------------
       1 | Academy Dinosaur
       2 | Ace Goldfinger
       3 | Adaptation Holes
(3 rows)

La siguiente sentencia utiliza los operadores igual (=) y OR en lugar del operador IN, lo que equivale a la consulta anterior:

SELECT 
  film_id, 
  title 
FROM 
  film 
WHERE 
  film_id = 1 
  OR film_id = 2 
  OR film_id = 3;

La consulta que utiliza el operador IN es más corta y más legible que la consulta que utiliza operadores iguales (=) y OR.

Además, PostgreSQL ejecuta la consulta con el operador IN mucho más rápido que la misma consulta que utiliza una lista de operadores OR.

Uso del operador IN de PostgreSQL con una lista de cadenas

Utilizaremos la tabla actor de la base de datos de ejemplo:

img

El siguiente ejemplo utiliza el operador IN para encontrar los actores que tienen el apellido en la lista 'Allen', 'Chase' y 'Davis':

SELECT 
  first_name, 
  last_name
FROM 
  actor 
WHERE 
  last_name IN ('Allen', 'Chase', 'Davis') 
ORDER BY 
  last_name;

Salida:

 first_name | last_name
------------+-----------
 Meryl      | Allen
 Cuba       | Allen
 Kim        | Allen
 Jon        | Chase
 Ed         | Chase
 Susan      | Davis
 Jennifer   | Davis
 Susan      | Davis
(8 rows)

Uso del operador IN de PostgreSQL con una lista de fechas

La siguiente sentencia utiliza el operador IN para encontrar pagos cuyas fechas de pago se encuentren en una lista de fechas: 2007-02-15 y 2007-02-16:

SELECT 
  payment_id, 
  amount, 
  payment_date 
FROM 
  payment 
WHERE 
  payment_date::date IN ('2007-02-15', '2007-02-16');

Salida:

payment_id | amount |        payment_date
------------+--------+----------------------------
      17503 |   7.99 | 2007-02-15 22:25:46.996577
      17504 |   1.99 | 2007-02-16 17:23:14.996577
      17505 |   7.99 | 2007-02-16 22:41:45.996577
      17512 |   4.99 | 2007-02-16 00:10:50.996577
...

En este ejemplo, la columna payment_date tiene el tipo timestamp que consta de partes de fecha y hora.

Para hacer coincidir los valores de la columna payment_date con una lista de fechas, debe convertirlos en valores de fecha que sólo contengan la parte de fecha.

Para ello, utilice el operador cast ::

payment_date::date

Por ejemplo, si el valor del timestamp es 2007-02-15 22:25:46.996577, el operador cast :: lo convertirá a 2007-02-15.

Operador NOT IN de PostgreSQL

Para negar el operador IN, se utiliza el operador NOT IN. Esta es la sintaxis básica del operador NOT IN:

value NOT IN (value1, value2, ...)Code language: SQL (Structured Query Language) (sql)

El operador NOT IN devuelve true si el value no es igual a ningún valor de la lista como value1 y value2; en caso contrario, el operador NOT IN devuelve false.

El operador NOT IN equivale a una combinación de varias expresiones booleanas con los operadores AND:

value <> value1 AND value <> value2 AND ...

Ejemplo de operador NOT IN de PostgreSQL

El siguiente ejemplo utiliza el operador NOT IN para recuperar películas cuyo id no sea 1, 2 o 3:

SELECT 
  film_id, 
  title 
FROM 
  film 
WHERE 
  film_id NOT IN (1, 2, 3) 
ORDER BY 
  film_id;

Salida:

 film_id |            title
---------+-----------------------------
       4 | Affair Prejudice
       5 | African Egg
       6 | Agent Truman
       7 | Airplane Sierra
       8 | Airport Pollock
...

La siguiente consulta recupera el mismo conjunto de datos pero utiliza los operadores no igual (<>) y AND:

SELECT 
  film_id, 
  title 
FROM 
  film 
WHERE 
  film_id <> 1 
  AND film_id <> 2 
  AND film_id <> 3 
ORDER BY 
  film_id;

Resumen

  • Utilice el operador IN para comprobar si un valor coincide con cualquier valor de una lista de valores.
  • Utilice el operador NOT para negar el operador IN.