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 NULL, 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 NULL.

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 NULL 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 NULL, 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 NULL.

Astuce : x NOT IN y est équivalent à NOT (x IN y) dans tout les cas. Néanmoins, les valeurs NULL 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

constructeur_lignes IS DISTINCT FROM
constructeur_lignes

Chaque côté est un constructeur de lignes comme décrit dans Section 4.2.11. Les deux valeurs de lignes doivent avoir le même nombre de lignes. 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 NULL des lignes sont combinées avec les règles 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).

    constructeur_lignes IS DISTINCT FROM constructeur_lignes
  

Cette construction est similaire à une comparaison de lignes <> mais cela ne ramène pas de NULL pour des entrées NULL. À la place, une valeur NULL est considérée différente (distincte de) toute valeur non NULL et deux valeurs NULL sont considérées égales (non distinctes). Du coup, le résultat sera toujours soit true soit false, jamais NULL.

    constructeur_lignes IS NULL
    constructeur_lignes IS NOT NULL
  

Ces constructions testent si la valeur d'une ligne est NULL ou non. Une valeur de ligne est considérée non NULL si au moins un champ n'est pas NULL.