PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.2 » Langage SQL » Fonctions et opérateurs » Fonctions et opérateurs de comparaison

9.2. Fonctions et opérateurs de comparaison #

Les opérateurs de comparaison habituels sont disponibles comme indiqués dans Tableau 9.1.

Tableau 9.1. Opérateurs de comparaison

OpérateurDescription
datatype < datatypeboolean Inférieur à
datatype > datatypeboolean Supérieur à
datatype <= datatypeboolean Inférieur ou égal à
datatype >= datatypeboolean Supérieur ou égal à
datatype = datatypeboolean Égal
datatype <> datatypeboolean Différent
datatype != datatypeboolean Différent

Note

<> 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)

datatype BETWEEN datatype AND datatypeboolean

Entre (les points de départ et d'arrêt sont inclus).

2 BETWEEN 1 AND 3t

2 BETWEEN 3 AND 1f

datatype NOT BETWEEN datatype AND datatypeboolean

Pas entre (la négation de BETWEEN).

2 NOT BETWEEN 1 AND 3f

datatype BETWEEN SYMMETRIC datatype AND datatypeboolean

Entre, après le tri des valeurs de départ et d'arrêt.

2 BETWEEN SYMMETRIC 3 AND 1t

datatype NOT BETWEEN SYMMETRIC datatype AND datatypeboolean

Pas entre, après le tri des valeurs de départ et d'arrêt.

2 NOT BETWEEN SYMMETRIC 3 AND 1f

datatype IS DISTINCT FROM datatypeboolean

Différent, en traitant les valeurs NULL comme des valeurs comparables entre elles.

1 IS DISTINCT FROM NULLt (plutôt que NULL)

NULL IS DISTINCT FROM NULLf (plutôt que NULL)

datatype IS NOT DISTINCT FROM datatypeboolean

Égal, en traitant les valeurs NULL comme des valeurs comparables entre elles.

1 IS NOT DISTINCT FROM NULLf (plutôt que NULL)

NULL IS NOT DISTINCT FROM NULLt (plutôt que NULL)

datatype IS NULLboolean

Teste si la valeur est NULL.

1.5 IS NULLf

datatype IS NOT NULLboolean

Teste si la valeur n'est pas NULL

'null' IS NOT NULLt

datatype ISNULLboolean

Teste si la valeur est NULL (syntaxe non standard).

datatype NOTNULLboolean

Teste si la valeur n'est pas NULL (syntaxe non standard).

boolean IS TRUEboolean

Teste si l'expression booléenne vaut true.

true IS TRUEt

NULL::boolean IS TRUEf (plutôt que NULL)

boolean IS NOT TRUEboolean

Teste si l'expression booléenne ne vaut pas true (donc false ou NULL).

true IS NOT TRUEf

NULL::boolean IS NOT TRUEt (plutôt que NULL)

boolean IS FALSEboolean

Teste si l'expression booléenne vaut false.

true IS FALSEf

NULL::boolean IS FALSEf (plutôt que NULL)

boolean IS NOT FALSEboolean

Teste si l'expression booléenne ne vaut pas false (donc soit true soit NULL).

true IS NOT FALSEt

NULL::boolean IS NOT FALSEt (plutôt que NULL)

boolean IS UNKNOWNboolean

Teste si l'expression booléenne renvoie inconnu.

true IS UNKNOWNf

NULL::boolean IS UNKNOWNt (plutôt que NULL)

boolean IS NOT UNKNOWNboolean

Teste si l'expression booléenne renvoie true ou false.

true IS NOT UNKNOWNt

NULL::boolean IS NOT UNKNOWNf (plutôt que NULL)


Le prédicat BETWEEN simplifie les tests d'intervalle :

a BETWEEN x AND y
   

est équivalent à :

a >= x AND a <= 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é.

Note

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 FROM b
a IS NOT DISTINCT FROM b
   

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 NULL
expression IS NOT NULL
   

ou les prédicats équivalents, mais non standards :

expression ISNULL
expression NOTNULL
   

N'écrivez pas expression = NULL car NULL 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.)

Astuce

Certaines applications pourraient s'attendre que expression = NULL renvoient true si expression 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_expression IS TRUE
boolean_expression IS NOT TRUE
boolean_expression IS FALSE
boolean_expression IS NOT FALSE
boolean_expression IS UNKNOWN
boolean_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

Fonction

Description

Exemple(s)

num_nonnulls ( VARIADIC "any" ) → integer

Renvoie le nombre d'arguments non NULL.

num_nonnulls(1, NULL, 2)2

num_nulls ( VARIADIC "any" ) → integer

Renvoie le nombre d'arguments NULL.

num_nulls(1, NULL, 2)1