Cette section dĂ©crit les expressions de sous-requĂȘtes compatibles SQL disponibles sous PostgreSQL. Toutes les formes d'expressions documentĂ©es dans cette section renvoient des rĂ©sultats boolĂ©ens (true/false).
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 agissent comme des constantes Ă chaque Ă©valuation de la sous-requĂȘte.
La sous-requĂȘte n'est habituellement pas exĂ©cutĂ©e plus qu'il n'est nĂ©cessaire pour dĂ©terminer si au moins une ligne est renvoyĂ©e. Elle n'est donc pas forcĂ©ment exĂ©cutĂ©e dans son intĂ©gralitĂ©. Il est de ce fait fortement dĂ©conseillĂ© d'Ă©crire une sous-requĂȘte qui prĂ©sente des effets de bord (tels que l'appel de fonctions de sĂ©quence) ; il est extrĂšmement difficile de prĂ©dire si ceux-ci se produisent.
Puisque le résultat ne dépend que d'un éventuel retour de lignes, et pas de
leur contenu, la liste des champs retournĂ©s par la sous-requĂȘte n'a normalement aucun intĂ©rĂȘt.
Une convention de codage habituelle consiste à écrire tous les tests EXISTS
sous la forme
EXISTS(SELECT 1 WHERE ...)
. Il y a toutefois des
exceptions Ă cette rĂšgle, comme les sous-requĂȘtes
utilisant INTERSECT
.
L'exemple suivant, simpliste, ressemble Ă une jointure interne sur col2
mais il sort au plus une ligne pour chaque ligne de
tab1
, mĂȘme s'il y a plusieurs correspondances dans les lignes de
tab2
:
SELECT col1 FROM tab1 WHERE EXISTS(SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
IN
expression
IN (sous-requĂȘte
)
Le cÎté droit est une sous-expression entre parenthÚses qui ne peut
retourner qu'une seule colonne. L'expression de 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 (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant aucune
ligne).
Si l'expression de 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
est
NULL, et non faux. Ceci est en accord avec les rĂšgles normales du SQL pour
les combinaisons booléennes de valeurs NULL.
Comme avec EXISTS
, on ne peut pas assumer que la
sous-requĂȘte est Ă©valuĂ©e complĂštement.
constructeur_ligne
IN (sous-requĂȘte
)
Le cÎté gauche de cette forme de IN
est un constructeur de ligne
comme décrit dans la Section 4.2.13.
Le cĂŽtĂ© droit est une sous-requĂȘte entre
parenthĂšses qui doit renvoyer exactement autant de colonnes qu'il y a
d'expressions dans le cÎté gauche. Les expressions cÎté gauche sont évaluées
et comparĂ©es ligne Ă 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 (ce qui inclut le cas spécial de
la sous-requĂȘte ne retournant 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 tous leurs membres correspondant 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 résultats par lignes sont différents ou nuls,
avec au moins un NULL, alors le résultat de IN
est nul.
NOT IN
expression
NOT IN (sous-requĂȘte
)
Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit
retourner exactement une colonne. L'expression de gauche est évalué et
comparĂ©e Ă chaque ligne de rĂ©sultat de la sous-requĂȘte.
Le résultat de NOT IN
n'est « true » que si des
lignes diffĂ©rentes de la sous-requĂȘte sont trouvĂ©es (ce qui inclut le cas
spĂ©cial de la sous-requĂȘte ne retournant pas de ligne).
Le résultat est « false » si une ligne égale est trouvée.
Si l'expression de gauche est nulle, ou qu'il n'y a pas de valeur Ă©gale Ă
droite et qu'au moins une ligne de droite est nulle, le résultat du
NOT IN
est nul, pas vrai. Cela concorde avec les rĂšgles
normales du SQL pour les combinaisons bouléennes de valeurs nulles.
Comme pour EXISTS
, on ne peut assumer que la sous-requĂȘte est
évaluée dans son intégralité.
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 la Section 4.2.13.
Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses qui doit renvoyer
exactement autant de colonnes qu'il y a d'expressions dans la ligne de gauche.
Les expressions de gauche sont évaluées et comparée ligne à ligne au
rĂ©sultat de la sous-requĂȘte. Le rĂ©sultat de NOT IN
n'est vrai (« true ») que si seules des lignes diffĂ©rentes de la sous-requĂȘte
sont trouvĂ©es (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant
aucune ligne). Le résultat est faux (« false ») si une ligne égale est
trouvée.
Comme d'habitude, les valeurs nulles des lignes sont combinées en accord
avec les rÚgles normales des expressions bouléennes SQL. Deux lignes sont
considérées égales si tous leurs membres correspondants sont non-nuls et
égaux ; les lignes sont différentes si les membres correspondants sont
non-nuls et différents ; dans tous les autres cas, le résultat de cette
comparaison de ligne est inconnu (nul). Si tous les résultats par ligne sont
différents ou nuls, avec au minimum un nul, alors le résultat du NOT
IN
est nul.
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Ăšses qui ne doit retourner
qu'une seule colonne. L'expression du cĂŽtĂ© gauche est Ă©valuĂ©e et comparĂ©e Ă
chaque ligne du rĂ©sultat de la sous-requĂȘte Ă l'aide de
l'opérateur
indiqué, ce qui doit aboutir à un
résultat booléen. Le résultat de ANY
est vrai
(« true ») si l'un des résultats est vrai. Le résultat est faux
(« false ») si aucun
rĂ©sultat vrai n'est trouvĂ© (ce qui inclut le cas spĂ©cial de la requĂȘte ne
retournant aucune ligne).
SOME
est un synonyme de ANY
.
IN
est équivalent à = ANY
.
En l'absence de succĂšs, mais si au moins une ligne du cĂŽtĂ© droit conduit Ă
NULL avec l'opérateur, le résultat de la construction ANY
est nul et non faux. Ceci est en accord avec les rĂšgles standard SQL
pour les combinaisons booléenne de valeurs NULL.
Comme pour EXISTS
, on ne peut assumer que la sous-requĂȘte
est évaluée entiÚrement.
constructeur_ligne
operator
ANY (sous-requĂȘte
)constructeur_ligne
operator
SOME (sous-requĂȘte
)
Le cÎté gauche de cette forme ANY
est un constructeur de
ligne, tel que décrit dans la Section 4.2.13.
Le cĂŽtĂ© droit est une sous-requĂȘte entre
parenthĂšses, qui doit renvoyer exactement autant de colonnes qu'il y a
d'expressions dans la ligne de gauche. Les expressions du cÎté gauche sont
évaluées et comparées ligne à ligne au résultat de la
sous-requĂȘte Ă l'aide de l'opĂ©rateur
donné.
Le résultat de ANY
est « true » si la comparaison
renvoie true pour une ligne quelconque de la sous-requĂȘte.
Le résultat est « false » si la comparaison renvoie false pour
chaque ligne de la sous-requĂȘte (ce qui inclut le cas spĂ©cial de la sous-requĂȘte
ne retournant aucune ligne). Le résultat est NULL si la comparaison ne renvoie
true pour aucune ligne, et renvoie NULL pour au moins une ligne. Le
rĂ©sultat est NULL si aucune comparaison avec une ligne de la sous-requĂȘte
ne renvoie true et qu'au moins une comparaison renvoie NULL.
Voir Section 9.23.5 pour la signification détaillée d'une comparaison de constructeur de ligne.
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 Ă l'aide de
l'opérateur
, ce qui doit renvoyer un résultat booléen.
Le résultat de ALL
est vrai (« true ») si toutes les
lignes renvoient true (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne
retournant aucune ligne). Le résultat est NULL si aucune comparaison
avec une ligne de la sous-requĂȘte ne renvoie false et qu'au moins une
comparaison renvoie NULL.
NOT IN
est équivalent à <> ALL
.
Comme pour EXISTS
, on ne peut assumer que la
sous-requĂȘte est Ă©valuĂ©e entiĂšrement.
constructeur_ligne
opérateur
ALL (sous-requĂȘte
)
Le cÎté gauche de cette forme de ALL
est un constructeur de
lignes, tel que décrit dans la Section 4.2.13.
Le cĂŽtĂ© droit 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 colonne de gauche. Les expressions du cÎté gauche sont
évaluées et comparées ligne à ligne au résultat de la
sous-requĂȘte Ă l'aide de l'opĂ©rateur
donné.
Le résultat de ALL
est « true » si la comparaison
renvoie true pour toutes les lignes de la sous-requĂȘte (ce qui inclut le cas
spĂ©cial de la sous-requĂȘte ne retournant aucune ligne).
Le résultat est « false » si la comparaison renvoie false pour
une ligne quelconque de la sous-requĂȘte. Le rĂ©sultat est NULL si aucune
comparaison avec une ligne de la sous-requĂȘte ne renvoie false et qu'au
moins une comparaison renvoie NULL.
Voir Section 9.23.5 pour la signification détaillée d'une comparaison de constructeur de ligne.
constructeur_ligne
opérateur
(sous-requĂȘte
)
Le cĂŽtĂ© gauche est un constructeur de lignes, tel que dĂ©crit dans la Section 4.2.13. Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses qui doit renvoyer exactement autant de colonnes qu'il y a d'expressions du cĂŽtĂ© gauche. De plus, la sous-requĂȘte ne peut pas renvoyer plus d'une ligne. (Si elle ne renvoie aucune ligne, le rĂ©sultat est considĂ©rĂ© nul.) Le cĂŽtĂ© gauche est Ă©valuĂ© et comparĂ© ligne complĂšte avec la ligne de rĂ©sultat de la sous-requĂȘte.
Voir Section 9.23.5 pour plus de détails sur la signification d'une comparaison de constructeur de ligne.