9.2. 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
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).
En plus des opérateurs de comparaison, on trouve la construction
spéciale BETWEEN.
a BETWEEN x AND y
est équivalent à
a >= x AND a <= y
De même,
a NOT BETWEEN x AND y
est équivalent à
a < x OR a > y
Il n'y a pas de différence entre les deux formes respectives si ce
n'est les cycles CPU requis pour
ré-écrire en interne la première sous la forme de la seconde.
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 à sa droite ; la bonne échelle de valeurs est
déterminée automatiquement.
Pour vérifier si une valeur est NULL ou non, on utilise les
constructions
expression IS NULL
expression IS NOT NULL
ou la construction équivalente, 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). Ce comportement est conforme au
standard SQL.
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. Tel était le comportement par défaut dans les versions
6.5 à 7.1 de PostgreSQL™.
Note
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. Cette
définition, conforme au standard SQL, est un changement du
comportement incohérent des versions de PostgreSQL™ antérieures à la 8.2.
L'opérateur standard de comparaison renvoie NULL (ce qui signifie
« inconnu ») si l'une des
entrées est NULL. Une autre façon d'effectuer les comparaisons
utilise la syntaxe IS [NOT] DISTINCT FROM :
expression IS DISTINCT FROM expression
expression IS NOT DISTINCT FROM expression
Pour des entrées non NULL, IS DISTINCT FROM
est identique à l'opérateur <>.
Cependant, si les deux entrées sont NULL, alors cela retourne faux et
si une des deux entrées est NULL, alors cela retourne vrai. De la
même façon, IS NOT DISTINCT FROM est
identique à = pour les entrées non NULL mais
il renvoie true si les deux entrées sont NULL et false quand une
seule est NULL. Dans ces constructions, NULL n'est plus considéré
comme un état inconnu mais comme une valeur.
Les valeurs booléennes peuvent aussi être testées en utilisant les
constructions
expression IS TRUE
expression IS NOT TRUE
expression IS FALSE
expression IS NOT FALSE
expression IS UNKNOWN
expression 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.