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.