Les prédicats permettent de créer des conditions telles que seules les lignes qui les respectent seront traitées. Vous trouverez une description des prédicats à la section Sélection de lignes. La présente section décrit les prédicats IN, BETWEEN, LIKE, EXISTS et les prédicats quantifiés.
Utilisez un prédicat IN pour comparer une valeur à plusieurs autres. Par exemple :
SELECT NAME FROM STAFF WHERE DEPT IN (20, 15)
Cet exemple équivaut à :
SELECT NAME FROM STAFF WHERE DEPT = 20 OR DEPT = 15
Utilisez les prédicats IN et NOT IN quand une sous-requête renvoie un ensemble de valeurs. Par exemple, la requête suivante permet de recenser les noms de tous les employés responsables des projets MA2100 et OP2012 :
SELECT LASTNAME FROM EMPLOYEE WHERE EMPNO IN (SELECT RESPEMP FROM PROJECT WHERE PROJNO = 'MA2100' OR PROJNO = 'OP2012')
La sous-requête n'est évaluée qu'une fois, et le résultat se place directement dans la requête externe, sous forme de liste. Par exemple, la sous-requête ci-dessous sélectionne les employés ayant les matricules 10 et 330. L'évaluation de la requête externe donne le même résultat que si elle contenait la clause WHERE suivante :
WHERE EMPNO IN (10, 330)
La liste renvoyée par la sous-requête peut ne contenir aucune valeur ou en comporter une ou plusieurs.
Utilisez un prédicat BETWEEN pour comparer une valeur à une plage de valeurs inclusives (nommées dans le prédicat BETWEEN).
L'exemple suivant recherche les noms des employés gagnant entre 10000 et 20000 F :
SELECT LASTNAME FROM EMPLOYEE WHERE SALARY BETWEEN 10000 AND 20000
Ceci équivaut à :
SELECT LASTNAME FROM EMPLOYEE WHERE SALARY >= 10000 AND SALARY <= 20000
L'exemple suivant recherche les noms des employés gagnant moins de 10000 ou plus de 20000 F :
SELECT LASTNAME FROM EMPLOYEE WHERE SALARY NOT BETWEEN 10000 AND 20000
Utilisez le prédicat LIKE pour rechercher les chaînes correspondant à certains modèles. Le modèle est précisé à l'aide du signe % et du trait de soulignement.
L'exemple suivant sélectionne les noms des employés comportant 7 caractères et commençant par la lettre 'S' :
SELECT NAME FROM STAFF WHERE NAME LIKE 'S _ _ _ _ _ _'
L'exemple suivant sélectionne les noms des employés commençant par une lettre autre que 'S' :
SELECT NAME FROM STAFF WHERE NAME NOT LIKE 'S%'
Une sous-requête peut être utilisée pour vérifier l'existence d'une ligne répondant à une condition. Dans ce cas, la sous-requête est liée à la requête externe par le prédicat EXISTS ou NOT EXISTS.
Si vous liez une sous-requête à une requête externe par le prédicat EXISTS, cette sous-requête ne renvoie pas de valeur. Le prédicat EXISTS est vrai si l'ensemble des réponses de la sous-requête contient une ligne ou plus, et il est faux s'il n'en contient aucune.
Le prédicat EXISTS est souvent utilisé avec les sous-requêtes corrélées. L'exemple ci-dessous recense les services ne possédant aucune entrée dans la table PROJECT :
SELECT DEPTNO, DEPTNAME FROM DEPARTMENT X WHERE NOT EXISTS (SELECT * FROM PROJECT WHERE DEPTNO = X.DEPTNO) ORDER BY DEPTNO
Il est possible de lier les prédicats EXISTS et NOT EXISTS à d'autres prédicats, en utilisant AND et OR dans la clause WHERE de la requête externe.
Un prédicat quantifié compare une valeur à une collection de valeurs. Si une instruction FULLSELECT renvoie plusieurs valeurs, vous devez modifier les opérateurs de comparaison du prédicat, en ajoutant le suffixe ALL, ANY ou SOME. Ces suffixes déterminent le traitement dans le prédicat externe de l'ensemble de valeurs renvoyées. Nous prenons ci-dessous l'opérateur de comparaison > comme exemple, mais les remarques s'appliquent également aux autres opérateurs :
L'exemple suivant utilise une sous-requête et une comparaison avec > ALL pour rechercher les noms et les professions des employés gagnant plus que tous les directeurs :
SELECT LASTNAME, JOB FROM EMPLOYEE WHERE SALARY > ALL (SELECT SALARY FROM EMPLOYEE WHERE JOB='MANAGER')
Pour de plus amples informations sur les prédicats et les opérateurs, consultez le document SQL Reference.