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 :
aBETWEENxANDy
est équivalent à :
a>=xANDa<=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 :
aIS DISTINCT FROMbaIS 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 :
expressionIS NULLexpressionIS NOT NULL
ou les prédicats équivalents, mais non standards :
expressionISNULLexpressionNOTNULL
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.
par exemple :
SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same'); SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows SELECT ROW(table.*) IS NOT NULL FROM table; -- detect all-non-null rows SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- detect at least one null in rows
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_expressionIS TRUEboolean_expressionIS NOT TRUEboolean_expressionIS FALSEboolean_expressionIS NOT FALSEboolean_expressionIS UNKNOWNboolean_expressionIS 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