9.17. Comparaisons de lignes et de tableaux

Cette section décrit plusieurs constructions spécialisées pour les comparaisons multiples entre des groupes de valeurs. Ces formes sont syntaxiquement en relation avec les formes de sous-requêtes de la section précédente mais n'impliquent pas de sous-requêtes. Ces formes impliquant des sous-expressions de tableaux sont des extensions de PostgreSQL ; le reste est compatible avec SQL. Toutes les formes d'expression documentées dans cette section renvoient des résultats booléens (true/false).

9.17.1. IN

expression IN
(valeur[, ...])

Le côté droit est une liste entre parenthèses d'expressions scalaires. Le résultat est vrai (<< true >>) si le côté gauche de l'expression est égal à une des expressions du côté droit. C'est une notation raccourci de

expression = value1
OR
expression = value2
OR
...

Notez que si l'expression du côté gauche renvoie nul ou s'il n'y a pas de valeurs du côté droit égales et qu'au moins une des expressions du côté droit renvoie la valeur nulle, le résultat de la construction IN sera nul et non pas faux. Ceci est en accord avec les règles standards SQL pour les combinaisons booléennes de valeurs nulles.

9.17.2. NOT IN

expression NOT IN
(valeur[, ...])

Le côté droit est une liste entre parenthèses d'expressions scalaires. Le résultat est vrai (<< true >>) si l'expression du côté gauche est différent de toutes les expressions du côté droit. Ceci est une notation raccourci pour

expression <> value1
AND
expression <> value2
AND
...

Notez que si l'expression du côté gauche renvoie une valeur nulle ou s'il existe des valeurs différentes du côté droit et qu'au moins une expression du côté droit renvoie la valeur nulle, 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 des valeurs nulles.

Astuce : x NOT IN y est équivalent à NOT (x IN y) dans tout les cas. Néanmoins, les valeurs nulles ont plus de chances de survenir pour le novice avec l'utilisation de NOT IN qu'en utilisant IN. Il est préférable d'exprimer votre condition de façon positive si possible.

9.17.3. ANY/SOME (array)

expression opérateur ANY
(expression tableau)
expression opérateur SOME
(expression tableau)

Le côté droit est une expression entre parenthèses qui doit renvoyer une valeur de type array. L'expression du côté gauche est évaluée et comparée à chaque élément du tableau en utilisant l'opérateur donné et qui doit renvoyer 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é (ceci incluant le cas spécial où le tableau a zéro élément).

SOME est un synonyme pour ANY.

9.17.4. ALL (array)

expression opérateur ALL
(expression tableau)

Le côté droit est une expression entre parenthèses qui doit renvoyer une valeur de type tableau. L'expression du côté gauche est évaluée et comparée à chaque élément du tableau en utilisant l'opérateur donné qui doit renvoyer un résultat booléen. Le résultat de ALL est vrai (<< true >>) si toutes les comparaisons renvoient vrai (ceci incl ut le cas spécial où le tableau a zéro élément). Le résultat est faux (<< false >> si un résultat faux est trouvé.

9.17.5. Comparaison sur des lignes complètes

(expression [,
expression ...])
opérateur (expression
[, expression ...])

Chaque côté est une liste d'expressions scalaires ; les deux listes doivent être de la même taille. Chaque côté est évaluée et ils sont comparés ligne par ligne. Actuellement, seuls les opérateurs = et <> sont autorisés dans les comparaisons de ligne. Le résultat est vrai (<< true >>) si les deux lignes sont respectivement égales ou différentes.

Comme d'habitude, les valeurs nulles des lignes sont combinées avec les règ les standards des expressions booléennes SQL. Les deux lignes sont considérées égales si leur membres correspondants sont non nul et égaux ; les lignes sont différentes si un des membres correspondants est non nul et différent ; sinon le résultat de la comparaison de ligne est inconnu (nul).