| Documentation PostgreSQL 7.2 | ||
|---|---|---|
| <<< Previous | Fonctions et Opérateurs | Next >>> |
Cette section décrit les expressions sous requêtes conformes au SQL disponibles dans PostgreSQL. L'ensemble des formes d'expression documentées dans cette section renvoient des résultats booléens (true/false).
EXISTS ( subquery ) |
L'argument de EXISTS est un SELECT arbitraire, ou sous requête. La sous requête est évaluée pour déterminer si elle renvoit des lignes. Si elle renvoit au moins une ligne, le résultat de EXISTS est TRUE; si la sous requête ne retourne pas de ligne, le résultat de EXISTS est FALSE.
a sous requête peut se référer aux variables de la requête environnante, qui agira comme constante pendant la durée de l'évaluation.
La sous requête sera exécutée aussi loin que nhécessaire pour déterminer si au moins une ligne est retournée, pas la totalité pour la complétion. Il est imprudent d'écrire des sous requêtes qui ont des effets secondaires (comme des appels fonctions séquence); il est difficile de prédire si l'effet secondaire apparaîtra ou pas.
Comme le résultat dépend des lignes retournées ou non, et pas du contenu des ces lignes, la sortie de ces sous requêtes et normalement inintéressante. Une convention de codage est d'écrire tous les tests EXISTS de la forme EXISTS(SELECT 1 WHERE ...). Il y a cependant des exceptions à cette règle, comme les sous requêtes qui utilisent INTERSECT.
Cet exemple simple est comme une jointure interne sur la colonne2, mais elle produit au moins une sortie-ligne pour chaque ligne tab1, même s'il y a de multiples égalités de lignes tab2 :
SELECT col1 FROM tab1
WHERE EXISTS(SELECT 1 FROM tab2 WHERE col2 = tab1.col2); |
expression IN (value[, ...]) |
Le côté droit de la forme IN est une liste entre parenthèses d'expressions extensibles. Le résultat est TRUE si le résultat du côté gauche de l'expression est égal à une des expressions du côté droit. C'est une notation sténo pour
expression = value1 OR expression = value2 OR ... |
![]() | La forme de IN n'est pas vraiment une expression de sous requête, mais semble mieux la documenter à la place de la sous requête IN. |
expression IN (subquery) |
Le côté droit de la forme IN est une sous requête entre parenthèses, qui doit retourner exactement une colonne. L'expression du côté gauche est évaluée et comparée à chaque ligne du résultat de la sous requête. Le résultat de IN est TRUE si une ligne sous requête égale est trouvée. Le résultat est FALSE si aucune ligne égale n'est trouvée (incluant le cas particulier où la sous requête ne retourne aucune ligne).
Notez que si l'expression côté gauche produit NULL, ou s'il n'y a pas de valeurs côté droit et qu'au moins une ligne côté droit produit NULL, le résultat de la construction IN sera NULL, pas FALSE. Ceci est en accord avec les règles normales du SQL pour les combinaisons booléennes de valeurs NULL.
Comme avec EXISTS, il est imprudent de supposer que la sous requête sera évaluée complètement.
(expression, expression[, ...]) IN (subquery) |
Le côté droit de la forme de IN est une sous requête entre parenthèses, qui doit renvoyer exactement le nombre de colonnes qu'il y d'expressions dans la liste 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 TRUE si une ligne de sous requête égale est trouvée. Le résultat est FALSE si aucune ligne égale n'est trouvée (incluant le cas particulier où la sous requête ne retourne aucune ligne).
Habituellement, les NULL dans les expressions ou les lignes de sous requêtes sont combinées par les règles normales des expressions booléennes SQL. Deux lignes sont considérées égales si certains de leurs membres correspondants sont non-null ou égaux; les lignes ne sont pas égales si certains membres correspondants sont non-null ou inégaux; autrement le résultat de cette comparaison de lignes est inconnu (NULL). Si tous les résultats des lignes sont soit inégaux soit NULL, avec au moins un NULL, alors le résultat de IN est NULL.
expression NOT IN (value[, ...]) |
Le côté droit de la forme NOT IN est une liste entre parenthèses d'expressions extensibles. Le résultat est TRUE si le résultat du côté gauche de l'expression est inégale par rapport à toutes les expressions du côté droit. C'est une notation sténo pour
expression <> value1 AND expression <> value2 AND ... |
![]() | x NOT IN y est équivalent à NOT (x IN y) dans tous les cas. Cependant, les NULL sont plus propres à induire en erreur un novice quand il utilise NOT IN que lorsuq'il travaille avec IN. |
expression NOT IN (subquery) |
Le côté droit de la forme NOT IN est une sous requête entre parenthèses, qui doit retouner une colonne exactement. L'expression côté gauche est évaluée et comparée à chaque ligne du résultat de la sous requête. Le résultat de NOT IN est TRUE si seulement des lignes de la sous requête inégales sont trouvées (incluant le cas spécial où la sous requête ne retourne aucune ligne). Le résultat est FALSE si aucune ligne égale n'est trouvée.
Notez que si l'expression côté gauche produit NULL, ou s'il n'y a pas de valeurs côté droit égales et au moins une ligne côté droit produisant NULL, le résultat de la construction NOT IN sera NULL, pas TRUE. Ceci est en accord avec les règles normales du SQL pour les combinaisons booléennes des valeurs NULL.
Comme avec EXISTS, il est imprudent de supposer que la sous requête sera évaluée complètement.
(expression, expression[, ...]) NOT IN (subquery) |
Le côté droit de la forme NOT IN est une sous requête entre parenthèses, qui doit retouner exactement le même nombre de colonnes qu'il y a d'expressions côté gauche. Les expressions 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 TRUE si seulement des lignes inégales de la sous requête sont trouvées (incluant le cas spécial où la sous requête ne retourne aucune ligne). Le résultat est FALSE si aucune ligne égale n'est trouvée.
Comme d'habitude, les NULL dans les expressions ou les lignes de sous requête sont combinées par les règles SQL normales des expressions booléennes. Deux lignes sont considéreés égales si tous leurs membres correspondant sont non-null ou égaux; les lignes sont inégales si certains membres correspondant sont non-null ou inégaux; autrement le résultat de la comparaison de ligne est inconnu (NULL). Si tous les résultats de lignes sont soit inégaux soit NULL, avec au moins un NULL, le résultat de NOT IN sera NULL.
expression operator ANY (subquery) expression operator SOME (subquery) |
Le côté droit de la forme ANY est une sous requête entre parenthèses, qui doit retourner exactement une colonne. L'expression côté gauche est évaluée et comparée à chaque ligne du résultat de la sous requête en utilisant l'opérateur donné, lequel doit produire un résultat booléen. Le résultat de ANY est TRUE si un résultat true est obtenu. Le résultat est FALSE si aucun résultat true est trouvé (incluant le cas spécial où la sous requête ne retourne pas de ligne).
SOME est synonyme de ANY. IN est équivalent à = ANY.
Notez que si ça ne réussit pas et qu'au moins une ligne côté droit produit NULL comme résultat des opérateurs, le résultat de la construction ANY sera NULL, pas FALSE. Ceci est en accord avec les règles SQL normales pour les combinaisons de valeurs NULL.
Comme avec EXISTS, il est imprudent de supposer que la sous requête sera évaluée complètement.
(expression, expression[, ...]) operator ANY (subquery) (expression, expression[, ...]) operator SOME (subquery) |
Le côté droit de la forme ANY est une sous requête entre parenthèses,quit doit retourner exactement le même nombre de colonnes qu'il y a d'expressions du côté gauche. Les expressions côté gauche sont évaluées et comparées ligne par ligne à chaque ligne du résultat de la sous requête, utilisant l'opérateur donné. Actuellement, seuls les opérateurs = et <> sont admis dans les requêtes ANY. Le résultat de ANY est TRUE si une ligne égale ou inégale est trouvée, respectivement. Le résultat est FALSE si aucune ligne n'est trouvée (incluant le cas spécial où la sous requête ne retourne aucune ligne).
Comme d'habitude,les NULL dans les expressions ou les lignes de sous requête sont combinées par les règles normales du SQL pour les expressions booléennes. Deux lignes sont considérées égales si tous leurs membres correspondants sont non-null ou égaux; les lignes sont inégales si certains membres correspondants sont sont non-null ou inégaux; autrement le résultat de cette comparaison de lignes est inconnu (NULL). S'il y a au moins un résultat de ligne NULL, le résultat de ANY ne peut être FALSE; il sera TRUE ou NULL.
expression operator ALL (subquery) |
Le côté droit de la forme ALL est une sous requête entre parenthèses, qui doit retouner exactement une colonne. L'expression côté gauche est évaluée et comparée à chaque ligne du résultat de la sous requête utilisant l'opérateur donné, lequel doit produire un résultat booléen. Le résultat de ALL est TRUE si toutes les lignes produisent TRUE (Incluant le cas spécial où la sous requête ne retourne pas de ligne). Le résultat est FALSE si des résultats FALSE sont trouvés.
NOT IN est équivalent à <> ALL.
Notez que s'il n'y a pas d'erreurs mais au moins une ligne côté droit produisant NULL pour le résultat de l'opérateur, le résultat de la construction ALL sera NULL, pas TRUE. Ceci est en accord avec les règles normales du SQL pour les combinaisons booléennes des valeurs NULL.
Comme avec EXISTS, il est imprudent de croire que la sous requête sera évaluée complètement.
(expression, expression[, ...]) operator ALL (subquery) |
Le côté droit de la forme ALL est une sous requête entre parenthèses, qui doit retourner exactement le même nombre de colonnes qu'il y a d'expressions côté gauche. Les expressions côté gauche sont évaluées et comparées ligne par ligne à chaque ligne du résultat de la sous requête,utilisant l'opérateur donné. Actuellement, seulement les opérateurs = et <> sont admis dans les requêtes ligne par ligne ALL. Le résultat de ALL est TRUE si toutes les lignes de sous requête sont égales ou inégales, respectivement (incluant le cas spécial où la sous requête ne retourne pas de ligne). Le résultat est FALSE si une ligne est inégale ou égale, respectivement.
Comme d'habitude, les NULLs dans les expressions ou les lignes de sous requête sont combinées par les règles normales des expressions booléennes SQL. Deux lignes sont considérées égales si tous leurs membres correspondants sont non-null ou égaux; les lignes sont inégales si certains de leurs membres correspondants sont non-null ou inégaux; Autrement le résultat de chaque comparaison de ligne est inconnu (NULL). S'il y a au moins une ligne résultat NULL, alors le résultat de ALL ne peut être TRUE; il sera FALSE ou NULL.
(expression, expression[, ...]) operator (subquery) (expression, expression[, ...]) operator (expression, expression[, ...]) |
Le côté gauche est une liste d'expressions extensibles. Le côté droit peut être soit une liste d'expressions extensibles de même longueur, soit une sous requête entre parenthèses, laquelle doit retouner exactement le même nombre de colonnes qu'il y a d'expressions sur le côté gauche. De plus, la sous requête ne peut retourner plus d'une ligne. (Si elle retourne zero ligne, le résultat est considéré comme NULL). Le côté gauche est évalué et comparé ligne par ligne au résultat de la ligne unique de la sous requête, ou au côté droit de l'expression de la liste. Actuellement, seuls les opérateurs = et <> sont admis dans les comparaisons ligne par ligne. Le résultat est TRUE si les deux lignes sont égales ou inégales, respectivement.
Comme d'habitude, les NULL dans les expressions ou les lignes de sous requête sont combinées par les règles normales des expressions booléennes SQL. Deux lignes sont considérées égales si tous leurs membres correspondants sont non-null et égaux; les lignes sont inégales si certains membres correspondants sont non-null et inégaux; autrement le résultat de la comparaison de ligne est inconnu (NULL).
| <<< Previous | Home | Next >>> |
| Fonctions d'agrégation | Up | Conversion de type |