Les opérateurs de comparaison habituels sont disponibles, comme l'indique le Tableau 9.1.
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 |
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. 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) |
expression_booléenne IS TRUE | est true |
expression_booléenne IS NOT TRUE | est false ou inconnu |
expression_booléenne IS FALSE | est false |
expression_booléenne IS NOT FALSE | est true ou inconnu |
expression_booléenne IS UNKNOWN | est inconnu |
expression_booléenne IS NOT UNKNOWN | est true ou false |
Le prédicat BETWEEN
simplifie les tests d'intervalle.
a
BETWEENx
ANDy
est équivalent à
a
>=x
ANDa
<=y
Notez que BETWEEN
traite le point final comme inclus dans
l'échelle des valeurs. NOT BETWEEN
fait la comparaison
inverse :
a
NOT BETWEENx
ANDy
est équivalent à
a
<x
ORa
>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 FROMb
a
IS NOT DISTINCT FROMb
Pour les entrées non NULL, IS DISTINCT FROM
est
identique à l'opérateur <>
. Néanmoins, si les
entrées sont NULL, il renvoie faux. Si une seule entrée est NULL, il
renvoie vrai. De la même façon, IS NOT DISTINCT FROM
est identique à =
pour les entrées non NULL, mais
renvoie vrai quand les deux entrées sont NULL, et faux 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 NULLexpression
IS NOT NULL
ou le prédicat équivalent, non standard,
expression
ISNULLexpression
NOTNULL
On ne peut pas écrire
,
parce que expression
= NULLNULL
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.)
Il se peut que des applications s'attendent à voir
évaluée à vrai (true) si expression
= NULLexpression
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 TRUEexpression_booléenne
IS NOT TRUEexpression_booléenne
IS FALSEexpression_booléenne
IS NOT FALSEexpression_booléenne
IS UNKNOWNexpression_booléenne
IS NOT UNKNOWN
Elles retournent toujours vrai ou faux, 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é dans Tableau 9.3.
Tableau 9.3. Fonctions de comparaison