IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

9.2. Fonctions et opérateurs de comparaison

Les opérateurs de comparaison habituels sont disponibles, comme l'indique le Tableau 9.1, « Opérateurs de comparaison ».

Tableau 9.1. Opérateurs de comparaison

Opérateur Description
< inférieur à
> supérieur à
<= inférieur ou égal à
>= supérieur ou égal à
= égal à
<> ou != différent de

[Note]

Note

L'opérateur != est converti en <> au moment de l'analyse. Il n'est pas possible d'implanter des opérateurs != et <> réalisant des opérations différentes.

Les opérateurs de comparaison sont disponibles pour tous les types de données pour lesquels cela a du sens. Tous les opérateurs de comparaison sont des opérateurs binaires renvoyant des valeurs du type boolean ; des expressions comme 1 < 2 < 3 ne sont pas valides (car il n'existe pas d'opérateur < de comparaison d'une valeur booléenne avec 3).

Il existe aussi quelques prédicats de comparaison, comme indiqué dans Tableau 9.2, « Prédicats de comparaison ». Ils se comportent comme des opérateurs, mais ont une syntaxe spéciale requise par le standard SQL.

Tableau 9.2. Prédicats de comparaison

Prédicat Description
a BETWEEN x AND y entre
a NOT BETWEEN x AND y pas entre
a BETWEEN SYMMETRIC x AND y entre, après tri des valeurs de comparaison
a NOT BETWEEN SYMMETRIC x AND y pas entre, après tri des valeurs de comparaison
a IS DISTINCT FROM b différent, en traitant null comme une valeur ordinaire
a IS NOT DISTINCT FROM b égal, en traitant null comme une valeur ordinaire
expression IS NULL est null
expression IS NOT NULL n'est pas null
expression ISNULL est null (syntaxe non standard)
expression NOTNULL n'est pas null (syntaxe non standard)
boolean_expression IS TRUE est true
boolean_expression IS NOT TRUE est false ou inconnu
boolean_expression IS FALSE est false
boolean_expression IS NOT FALSE est true ou inconnu
boolean_expression IS UNKNOWN est inconnu
boolean_expression IS NOT UNKNOWN est true ou false

Le prédicat BETWEEN simplifie les tests d'intervalle.

a BETWEEN x AND y

est équivalent à

a >= x AND a <= y

Notez que BETWEEN traite le point final comme inclut dans l'échelle des valeurs. NOT BETWEEN fait la comparaison inverse :

a NOT BETWEEN x AND y

est équivalent à

a < x OR a > y

BETWEEN SYMMETRIC est identique à BETWEEN sauf qu'il n'est pas nécessaire que l'argument à gauche de AND soit plus petit ou égal à l'argument à droite. SI ce n'est pas le cas, ces deux arguments sont automatiquement inversés, pour qu'une échelle non vide soit toujours supposée.

Les opérateurs de comparaison habituels renvoient null (autrement dit « inconnu »), et non pas vrai ou faux, quand l'une des entrées est null. Par exemple, 7 = NULL renvoie null, tout comme 7 <> NULL. Quand ce comportement n'est pas convenable, utilisez les constructions IS [ NOT ] DISTINCT FROM :

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b

Pour les entrées non NULL, IS DISTINCT FROM est identique à l'opérateur <>. Néanmoins, si les entrées sont nulles, il renvoie false. Si une seule entrée est NULL, il renvoie true. De la même façon, IS NOT DISTINCT FROM est identique à = pour les entrées non NULL, mais renvoie true quand les deux entrées sont NULL, et false quand une seule entrée est NULL. De ce fait, ces constructions agissent réellement comme si NULL était une valeur normale de données, plutôt que « inconnue ».

Pour vérifier si une valeur est NULL ou non, on utilise les prédicats

expression IS NULL
expression IS NOT NULL

ou le prédicat équivalent, non standard,

expression ISNULL
expression NOTNULL

On ne peut pas écrire expression = NULL parce que NULL n'est pas « égal à » NULL. (La valeur NULL représente une valeur inconnue et il est impossible de dire si deux valeurs inconnues sont égales.)

[Astuce]

Astuce

Il se peut que des applications s'attendent à voir expression = NULL évaluée à vrai (true) si expression s'évalue comme la valeur NULL. Il est chaudement recommandé que ces applications soient modifiées pour se conformer au standard SQL. Néanmoins, si cela n'est pas possible, le paramètre de configuration transform_null_equals peut être utilisé. S'il est activé, PostgreSQL™ convertit les clauses x = NULL en x IS NULL.

Si l'expression est une valeur de ligne, alors IS NULL est vrai quand l'expression même de la ligne est NULL ou quand tous les champs de la ligne sont NULL alors que IS NOT NULL est vrai quand l'expression même de la ligne est non NULL et que tous les champs de la ligne sont non NULL. À cause de ce comportement, IS NULL et IS NOT NULL ne renvoient pas toujours des résultats inversés pour les expressions de lignes. En particulier, une expression de ligne qui contient à la fois des valeurs NULL et des valeurs non NULL retournera faux pour les deux tests. Dans certains cas, il serait préférable d'écrire row IS DISTINCT FROM NULL ou row IS NOT DISTINCT FROM NULL, qui vérifiera simplement si la valeur de ligne en aperçu est NULL sans tests supplémentaires sur les champs de la ligne.

Les valeurs booléennes peuvent aussi être testées en utilisant les prédicats

expression_booléenne IS TRUE
expression_booléenne IS NOT TRUE
expression_booléenne IS FALSE
expression_booléenne IS NOT FALSE
expression_booléenne IS UNKNOWN
expression_booléenne IS NOT UNKNOWN

Elles retournent toujours true ou false, jamais une valeur NULL, même si l'opérande est NULL. Une entrée NULL est traitée comme la valeur logique « inconnue ». IS UNKNOWN et IS NOT UNKNOWN sont réellement identiques à IS NULL et IS NOT NULL, respectivement, sauf que l'expression en entrée doit être de type booléen.

Certaines fonctions de comparaison sont aussi disponibles, comme indiquées dans Tableau 9.3, « Fonctions de comparaison ».

Tableau 9.3. Fonctions de comparaison

Fonction Description Exemple Résultat d'un exemple
num_nonnulls(VARIADIC "any") renvoie le nombre d'arguments non NULL num_nonnulls(1, NULL, 2) 2
num_nulls(VARIADIC "any") renvoie le nombre d'arguments NULL num_nulls(1, NULL, 2) 1