Notes et traduction du tutoriel PostgreSQL Tutorial
L'opérateur IN permet de vérifier si une valeur se trouve parmi une liste de valeurs :
VALUE IN (value1,value2,...)
L'opérateur IN retourne vrai si “value” est égale à l'une des valeurs de la liste : “value1”, “value2” etc.
IN accepte une liste de valeurs retournée par une requête (confère tutoriel sous-requête).
Du point de vue fonctionnel, utiliser l'opérateur IN est équivalent à combiner des expressions booléennes avec l'opérateur OR:
VALUE IN (value1,value2,...) # Equivaut VALUE = value1 OR VALUE = value2 OR ...
Par exemple :
SELECT film_id, title FROM film WHERE film_id IN (1, 2, 3); -- Requête équivalente SELECT film_id, title FROM film WHERE film_id = 1 OR film_id = 2 OR film_id = 3;
L'usage de IN rend la première forme plus condensée et plus lisible.
Ci-dessous un exemple avec des chaînes de caractères :
SELECT first_name, last_name FROM actor WHERE last_name IN ('Allen', 'Chase', 'Davis') ORDER BY last_name;
Un autre exemple un peut particulier avec une valeur de type timestamp :
SELECT payment_id, amount, payment_date FROM payment WHERE payment_date::DATE IN ('2007-02-15', '2007-02-16');
La requête retourne:
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
...
Ici le champ payment_date est de type timestamp contenant une partie date et une partie heure. Pour pouvoir comparer la valeur payment_date avec une liste de dates, il faut d'abord changer son type via l'opérateur de transtypage :: (cast operator)
-- Convertir le timestamp en date payment_date::DATE
Par exemple si le timestamp vaut 2007-02-15 22:25:46.996577, l'opérateur de transtypage le convertit en 2007-02-15.
L'opérateur NOT IN retourne vrai si la valeur est différente de tous les éléments de la liste.
Utiliser l'opérateur NOT IN est équivalent à utiliser une combinaison d'expression booléennes avec des opérateurs AND :
VALUE NOT IN (value1, value2, ...) -- Equivaut VALUE <> value1 AND VALUE <> value2 AND ...
Par exemple :
SELECT film_id, title FROM film WHERE film_id NOT IN (1, 2, 3) ORDER BY film_id; -- Requête équivalente SELECT film_id, title FROM film WHERE film_id <> 1 AND film_id <> 2 AND film_id <> 3 ORDER BY film_id;
IN pour vérifier si une valeur se trouve dans une liste de valeurs ;NOT pour inverser la comparaison et vérifier qu'un valeur est bien absente d'une liste de valeurs.