Les opérateurs de comparaison habituels sont disponibles comme indiqués dans Tableau 9.1.
Tableau 9.1. Opérateurs de comparaison
Opérateur | Description |
---|---|
datatype < datatype
→ boolean
| Inférieur à |
datatype > datatype
→ boolean
| Supérieur à |
datatype <= datatype
→ boolean
| Inférieur ou égal à |
datatype >= datatype
→ boolean
| Supérieur ou égal à |
datatype = datatype
→ boolean
| Égal |
datatype <> datatype
→ boolean
| Différent |
datatype != datatype
→ boolean
| Différent |
<>
est la notation du standard SQL « non
égal ». !=
est un alias, converti en
<>
au tout début de l'analyse. De ce fait, il
n'est pas possible d'implémenter des opérateurs !=
et
<>
qui se comporteraient différemment.
Ces opérateurs de comparaison sont disponibles pour les types de données natifs qui ont un tri naturel, incluant les types des nombres, des chaînes et des dates/heures. De plus, les tableaux, types composites et intervalles peuvent être comparés si le type de données de leurs éléments sont comparables.
Il est généralement possible de comparer les valeurs de types de données
en relation ; par exemple integer
>
bigint
fonctionnera. Certains cas de
ce type sont implémentés directement par des opérateurs de comparaison
« inter-type », mais si aucun opérateur de ce type n'est
disponible, l'analyseur va forcer une conversion de type du type le plus
spécifique au type le plus global., et appliquer l'opérateur de
comparaison correspondant.
Comme indiqué ci-dessus, tous les opérateurs de comparaison sont des
opérateurs binaires, renvoyant des valeurs de type boolean
.
De ce fait, les expressions comme 1 < 2 < 3
ne
sont pas valides (parce qu'il n'existe pas d'opérateur
<
comparant une valeur booléenne avec
3
). Utilisez les prédicats BETWEEN
affichés ci-dessous pour réaliser des tests sur des intervalles.
Il existe aussi des prédicats de comparaison, comme indiqués dans Tableau 9.2. Ils se comportent comme des opérateurs, mais disposent d'une syntaxe spéciale mandatée par le standard SQL.
Tableau 9.2. Prédicats de comparaison
Prédicat Description Exemple(s) |
---|
Entre (les points de départ et d'arrêt sont inclus).
|
Pas entre (la négation de
|
Entre, après le tri des valeurs de départ et d'arrêt.
|
Pas entre, après le tri des valeurs de départ et d'arrêt.
|
Différent, en traitant les valeurs NULL comme des valeurs comparables entre elles.
|
Égal, en traitant les valeurs NULL comme des valeurs comparables entre elles.
|
Teste si la valeur est NULL.
|
Teste si la valeur n'est pas NULL
|
Teste si la valeur est NULL (syntaxe non standard). |
Teste si la valeur n'est pas NULL (syntaxe non standard). |
Teste si l'expression booléenne vaut true.
|
Teste si l'expression booléenne ne vaut pas true (donc false ou NULL).
|
Teste si l'expression booléenne vaut false.
|
Teste si l'expression booléenne ne vaut pas false (donc soit true soit NULL).
|
Teste si l'expression booléenne renvoie inconnu.
|
Teste si l'expression booléenne renvoie 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 les valeurs de départ et d'arrêt
comme inclus à l'intervalle. BETWEEN SYMMETRIC
est
identique à BETWEEN
sauf qu'il n'y a pas d'obligation
que l'argument de gauche de AND
soit inférieur ou égale
à l'argument de droite. Dans le cas contraire, les deux arguments sont
automatiquement inversés pour qu'un intervalle non vide soit toujours de
rigueur.
Les différentes variantes de BETWEEN
sont implémentées
dans les termes des opérateurs de comparaison standard et, de ce fait,
fonctionneront pour tout type de données qui peut être comparé.
L'utilisation de AND
dans la syntaxe
BETWEEN
crée une ambiguité avec l'utilisation de
AND
comme opérateur logique. Pour résoudre ceci, seul
un ensemble limité de types d'expression est autorisé comme deuxième
argument d'une clause BETWEEN
. Si vous avez besoin
d'écrire une sous-expression plus complexe dans
BETWEEN
, ajoutez des parenthèses autour de la
sous-expression.
Les opérateurs de comparaison habituels renvoient NULL (signifiant
« inconnu »), et non pas true ou false, si l'argument
est NULL. Par exemple, 7 = NULL
renvoie NULL, tout
autant que 7 <> NULL
. Si ce comportement n'est
pas adéquat, utilisez les prédicats IS [ NOT ]
DISTINCT FROM
:
a
IS DISTINCT FROMb
a
IS NOT DISTINCT FROMb
Pour les valeurs non NULL, IS DISTINCT FROM
est
identique à l'opérateur <>
. Néanmoins, si les
deux arguments sont NULL, il renvoie false et si un seul des deux
arguments est NULL, il renvoie true. De la même façon, IS NOT
DISTINCT FROM
est identique à =
pour les
arguments non NULL, mais il renvoie true quand les deux arguments sont
NULL et false quand un seul argument est NULL. De ce fait, ces prédicats
agissent comme si NULL était une valeur normale, plus
qu'« inconnue ».
Pour vérifier si une valeur est NULL ou non, utilisez le prédicat :
expression
IS NULLexpression
IS NOT NULL
ou les prédicats équivalents, mais non standards :
expression
ISNULLexpression
NOTNULL
N'écrivez pas
car
expression
= NULLNULL
n'est pas « égal à »
NULL
. (La valeur NULL représente une valeur inconnue,
et il n'est pas possible de savoir si deux valeurs inconnues sont égales.)
Certaines applications pourraient s'attendre que
renvoient
true si expression
= NULLexpression
s'évalue à la valeur NULL.
Il est hautement recommandé que ces applications soient modifiées pour se
conformer au standard SQL. Néanmoins, si cela ne peut pas se faire, le
paramètre transform_null_equals est disponible. S'il
est activé, PostgreSQL convertira les clauses
x = NULL
en x IS NULL
.
Si l'expression
est une valeur ligne, alors
IS NULL
est true quand l'expression de ligne elle-même
est NULL ou quand tous les champs de la ligne sont NULL, alors que
IS NOT NULL
est true quand l'expression de ligne
elle-même 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 ligne ; en particulier, une expression de ligne qui
contient des champs NULL et non NULL renverra false pour les deux tests.
Dans certains cas, il pourrait être préférable d'écrire
ligne
IS DISTINCT FROM NULL
ou ligne
IS NOT DISTINCT FROM
NULL
, qui va simplement vérifier si la valeur de ligne globale
est NULL, sans tester les champs de la ligne.
Les valeurs booléennes peuvent aussi être testées en utilisant les prédicats
boolean_expression
IS TRUEboolean_expression
IS NOT TRUEboolean_expression
IS FALSEboolean_expression
IS NOT FALSEboolean_expression
IS UNKNOWNboolean_expression
IS NOT UNKNOWN
Ils renverront toujours true ou false, jamais une valeur NULL, même quand
l'opérande est NULL. Un argument NULL est traité comme la valeur logique
« inconnue ». Notez que IS UNKNOWN
et
IS NOT UNKNOWN
sont identiques à IS
NULL
et IS NOT NULL
, respectivement, sauf que
l'expression en argument doit être de type booléen.
Quelques fonctions de comparaison sont aussi disponibles, comme indiquées dans Tableau 9.3.
Tableau 9.3. Fonctions de comparaison