9.16. Expressions de sous-expressions

Cette section décrit les expressions de sous-requêtes compatibles SQL et disponibles avec PostgreSQL. Toutes les formes d'expressions documentées dans cette section renvoient des résultats booléens (true/false).

9.16.1. EXISTS

EXISTS ( sous-requête )

L'argument d'EXISTS est une instruction SELECT arbitraire ou une sous-requête. La sous-requête est évaluée pour déterminer si elle renvoie des lignes. Si elle en renvoie au moins une, le résultat d'EXISTS est vrai (<< true >>) ; si elle n'en renvoie aucune, le résultat d'EXISTS est faux (<< false >>).

La sous-requête peut faire référence à des variables de la requête englobante qui agiront comme des constantes lors d'une évaluation de la sous-requête.

La sous-requête sera exécutée suffisamment pour déterminer si une ligne est renvoyée, donc pas obligatoirement complètement. Il est déconseillé d'écrire une sous-requête qui a des effets de bord (tel que l'appel de fonctions de séquence) ; que l'effet de bord se fasse ou non serait difficile à prédire.

Comme le résultat dépend seulement du fait que des lignes sont renvoyées et, donc, que le contenu des lignes importe peu, la liste de sortie de la sous-requête est normalement inintéressant. Une convention de codage commune est l'écriture de tous les tests EXISTS dans la forme EXISTS(SELECT 1 WHERE ...). Néanmoins, il y a des exceptions à cette règle, exceptions comme des sous-requêtes utilisant INTERSECT.

Ce simple exemple ressemble à une jointure interne sur col2 mais il produit au plus une ligne en sortie pour chaque ligne de tab1 même s'il y a plusieurs correspondances parmi les lignes de tab2 :

SELECT col1 FROM tab1
    WHERE EXISTS(SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

9.16.2. IN

expression IN
(sous-requête)

Le côté droit est une sous-expression entre parenthèses qui retournera qu'une seule ligne. L'expression gauche est évaluée et comparée à chaque ligne du résultat de la sous-requête. Le résultat de IN est vrai (<< true >>) si une ligne équivalente de la sous-requête est trouvée. Le résultat est faux (<< false >>) si aucune ligne correspondante n'est trouvée (ceci incluant le cas spécial où la sous-requête ne renvoie aucune ligne).

Notez que si l'expression gauche est NULL ou s'il n'existe pas de correspondance avec les valeurs du côté droit et qu'au moins une ligne du côté droit est NULL, le résultat de la construction IN sera nul, et non pas faux. Ceci est en accord avec les règles normales du SQL pour les combinaisons booléennes des valeurs NULL.

Comme avec EXISTS, il n'est pas conseillé d'assumer que la sous-requête sera évaluée complètement.

constructeur_ligne IN (sous-requête)
  

Le côté gauche de la forme IN est un constructeur de ligne comme décrit dans Section 4.2.11. Le côté droit de la forme IN est une sous-requête entre parenthèses qui doit renvoyer exactement autant de colonnes qu'il n'y a d'expressions dans le côté gauche. Les expressions côté gauche sont évaluées et comparées ligne par ligne au résultat de la sous-requête. Le résultat de IN est vrai (<< true >>) si une ligne équivalente de la sous-requête est trouvée. Le résultat est faux (<< false >>) si aucune ligne correspondante n'est trouvée (ceci incluant le cas spécial où la sous-requête ne renvoie aucune ligne).

Comme d'habitude, les valeurs NULL dans les lignes sont combinées suivant les règles habituelles des expressions booléennes SQL. Deux lignes sont considérées égales si leurs membres correspondants sont non nuls et égaux ; les lignes diffèrent si le contenu de leurs membres sont non nuls et différents ; sinon le résultat de la comparaison de la ligne est inconnu, donc nul. Si tous les lignes résultantes sont soit différentes soit NULL, avec au moins une NULL, alors le résultat de IN est nul.

9.16.3. NOT IN

constructeur_ligne NOT IN (sous-requête)

Le côté gauche de cette forme de NOT IN est un constructeur de lignes, comme décrit dans Section 4.2.11. Le côté droit est une sous-requête entre parenthèses qui doit renvoyer une colonne exactement. L'expression gauche est évaluée et comparée à chaque ligne du résultat de la sous-requête. Le résultat de NOT IN est vrai (<< true >>) si seules des lignes différentes de la sous-requête sont trouvées (ceci incluant le cas spécial où la sous-requête ne renvoie aucune ligne). Le résultat est faux (<< false >>) si une ligne égale est trouvée.

Notez que si l'expression gauche renvoie un résultat nul ou s'il n'existe pas de valeurs du côté droit égales et qu'au moins une ligne du côté droit renvoie nul, le résultat de la construction NOT IN sera nul, et non pas vrai. Ceci est en accord avec les règles standards du SQL pour les combinaisons booléennes de valeurs NULL.

Comme avec EXISTS, il n'est pas conseillé d'assumer que la sous-requête sera évaluée complètement.

constructeur_ligne operator ANY
(sous-requête)
constructeur_ligne operator SOME
(sous-requête)

Le côté droit de la forme ANY est un constructeur de lignes, comme décrit dans Section 4.2.11. Le côté droit de cette forme de NOT IN est une sous-requête entre parenthèses qui doit renvoyer exactement autant de colonnes qu'il n'y a d'expressions dans la ligne gauche. Les expressions du côté gauche sont évaluées et comparées ligne par ligne à chaque ligne du résultat de la sous-requête. Le résultat de NOT IN est vrai (<< true >>) si seules des lignes différentes de la sous-requête sont trouvées (ceci inclut le cas spécial où la sous-requête ne renvoie aucune ligne). Le résultat est faux (<< false >>) si aucune ligne égale n'est trouvée.

Comme d'habitude, les valeurs NULL de la ligne sont combinées suivant les règles standards du SQL sur les expressions booléennes. Deux lignes sont considérées égales si tous leurs membres correspondant sont non nuls et égaux ; les lignes sont différentes si un des membres correspondants est non nul et différent ; sinon le résultat de cette comparaison de ligne est inconnu (nul). Si tous les résultats ligne sont soit différents soit nuls, avec au moins un nul, alors le résultat de NOT IN est nul.

9.16.4. ANY/SOME

expression opérateur ANY
(sous-requête)
expression opérateur SOME
(sous-requête)

Le côté droit est une sous-requête entre parenthèse qui ne doit retourner qu'une seule colonne. L'expression du côté gauche est évaluée et comparée à chaque ligne de la sous-requête en utilisant l'opérateur indiqué et rendant un résultat booléen. Le résultat de ANY est vrai (<< true >>) si un résultat vrai est obtenu. Le résultat est faux (<< false >>) si aucun résultat vrai n'est trouvée (ceci incluant le cas spécial où la requête ne renvoie aucune ligne).

SOME est un synonyme de ANY. IN est équivalent à = ANY.

Notez que sans succès et avec au moins une ligne NULL du côté droit pour le résultat de l'opérateur, le résultat de la construction ANY sera nul et non pas faux. Ceci est en accord avec les règles standards SQL pour les combinaisons booléenne de valeurs NULL.

Comme avec EXISTS, il n'est pas conseillé d'assumer que la sous-requête sera évaluée complètement.

(expression [,
expression ...]) opérateur
ANY (sous-requête)
(expression [,
expression ...]) opérateur
SOME (sous-requête)

Le côté droit de cette forme ANY est une sous-requête entre parenthèses, qui doit renvoyer exactement autant de colonnes qu'il n'y a d'expressions dans la liste gauche. Les expressions du côté gauche sont évaluées et comparées ligne par ligne à chaque ligne du résultat de la sous-requête en utilisant l'opérateur donné. Actuellement, seuls les opérateurs = et <> sont permis dans les constructions de ligne ANY. Le résultat de ANY est vrai (<< true >>) si une ligne est trouvée. Le résultat est faux (<< false >>) si aucune ligne n'est trouvée (ceci incluant le cas spécial où la sous-requête ne renverrait aucune ligne).

Comme d'habitude, les valeurs NULL dans les lignes sont combinées avec les règles standards des expressions booléennes en SQL. Deux lignes sont considérées égales si tous les membres correspondants sont non nuls et égaux ; les lignes sont différentes si un des membres est non nul et différent ; sinon le résultat de cette comparaison de lignes est inconnu (donc nul). S'il y a au moins une ligne NULL, alors le résultat de ANY ne peut pas être faux (false) ; il sera vrai (true) ou nul.

9.16.5. ALL

expression opérateur ALL
(sous-requête)

Le côté droit est une sous-requête entre parenthèses qui ne doit renvoyer qu'une seule colonne. L'expression gauche est évaluée et comparée à chaque ligne du résultat de la sous-requête en utilisant l'opérateur qui doit renvoyer un résultat booléen. Le résultat de ALL est vrai (<< true >>) si toutes les lignes renvoient true (ceci incluant le cas spécial où la sous-requête ne renvoie aucune ligne). Le résultat est faux (<< false >>) si un résultat faux est découvert.

NOT IN est équivalent à <> ALL.

Notez que s'il n'y a aucun échec mais qu'au moins une ligne du côté droit renvoie une valeur NULL sur le résultat de l'opérateur, le résultat de la construction ALL sera nul et non pas vrai. Ceci est en accord avec les règles standards du SQL pour les combinaisons booléennes de valeurs NULL.

Comme avec EXISTS, il est déconseillé d'assumer que la sous-requête sera évaluée complètement.

constructeur_ligne opérateur ALL (sous-requête)

Le côté gauche de cette forme de ALL est un constructeur de lignes comme décrit dans Section 4.2.11. Le côté droit de cette forme ALL est une sous-requête entre parenthèses qui doit renvoyer exactement le même nombre de colonnes qu'il y a d'expressions dans la ligne gauche. Les expressions du côté gauche sont évaluées et comparées ligne par ligne à chaque ligne du résultat de la sous-requête en utilisant l'opérateur donné. Actuellement, seuls les opérateurs = et <> sont autorisées dans les requêtes de ligne ALL. Le résultat de ALL est << true >> si toutes les lignes de la sous-requête sont respectivement égales ou différentes (ceci incluant le cas spécial où la sous-requête ne renvoie aucune ligne). Le résultat est faux (<< false >>) si une ligne se trouve être respectivement différente ou égale.

Comme d'habitude, les valeurs NULL des lignes sont combinées avec les règles standards des expressions booléennes en SQL. Deux lignes sont considérées égales si tous les membres correspondants sont non nuls et égaux ; les lignes sont différentes si un membre est non nul ou différent ; sinon le résultat de la comparaison de cette ligne est inconnue (nul). S'il y a au moins une ligne résultat NULL, alors le résultat de ALL ne peut pas être vrai (true) ; il sera faux (false) ou nul.

9.16.6. Comparaison de lignes complètes

constructeur_ligne opérateur (sous-requête)

Le côté gauche est un constructeur de lignes, comme décrit dans Section 4.2.11. Le côté droit est une sous-requête entre parenthèses qui doit renvoyer exactement autant de colonnes qu'il n'y a d'expressions su le côté gauche. De plus, la sous-requête ne peut pas renvoyer plus d'une ligne. (S'il ne renvoie aucune ligne, le résultat est pris comme s'il était nul.) Le côté gauche est évalué et comparé avec la ligne du résultat de la sous-requête. Actuellement, seuls les opérateurs = et <> sont autorisés dans les comparaisons de lignes. Le résultat est vrai (<< true >>) si les deux lignes sont respectivement égales ou différentes.

Comme d'habitude, les valeurs NULL des lignes sont combinées avec les règles standards des expressions booléennes SQL. Deux lignes sont considérées égales si tous les membres correspondants sont non nuls et égaux ; les lignes sont différentes si un membre correspondant est non nul et différent ; sinon le résultat de la comparaison de la ligne est inconnu (nul).