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