PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 18 RC1 » 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 < 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

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 datatype → boolean

Entre (les points de dĂ©part et d'arrĂȘt sont inclus).

2 BETWEEN 1 AND 3 → t

2 BETWEEN 3 AND 1 → f

datatype NOT BETWEEN datatype AND datatype → boolean

Pas entre (la négation de BETWEEN).

2 NOT BETWEEN 1 AND 3 → f

datatype BETWEEN SYMMETRIC datatype AND datatype → boolean

Entre, aprĂšs le tri des valeurs de dĂ©part et d'arrĂȘt.

2 BETWEEN SYMMETRIC 3 AND 1 → t

datatype NOT BETWEEN SYMMETRIC datatype AND datatype → boolean

Pas entre, aprĂšs le tri des valeurs de dĂ©part et d'arrĂȘt.

2 NOT BETWEEN SYMMETRIC 3 AND 1 → f

datatype IS DISTINCT FROM datatype → boolean

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

1 IS DISTINCT FROM NULL → t (plutît que NULL)

NULL IS DISTINCT FROM NULL → f (plutît que NULL)

datatype IS NOT DISTINCT FROM datatype → boolean

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

1 IS NOT DISTINCT FROM NULL → f (plutît que NULL)

NULL IS NOT DISTINCT FROM NULL → t (plutît que NULL)

datatype IS NULL → boolean

Teste si la valeur est NULL.

1.5 IS NULL → f

datatype IS NOT NULL → boolean

Teste si la valeur n'est pas NULL

'null' IS NOT NULL → t

datatype ISNULL → boolean

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

datatype NOTNULL → boolean

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

boolean IS TRUE → boolean

Teste si l'expression booléenne vaut true.

true IS TRUE → t

NULL::boolean IS TRUE → f (plutît que NULL)

boolean IS NOT TRUE → boolean

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

true IS NOT TRUE → f

NULL::boolean IS NOT TRUE → t (plutît que NULL)

boolean IS FALSE → boolean

Teste si l'expression booléenne vaut false.

true IS FALSE → f

NULL::boolean IS FALSE → f (plutît que NULL)

boolean IS NOT FALSE → boolean

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

true IS NOT FALSE → t

NULL::boolean IS NOT FALSE → t (plutît que NULL)

boolean IS UNKNOWN → boolean

Teste si l'expression booléenne renvoie inconnu.

true IS UNKNOWN → f

NULL::boolean IS UNKNOWN → t (plutît que NULL)

boolean IS NOT UNKNOWN → boolean

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

true IS NOT UNKNOWN → t

NULL::boolean IS NOT UNKNOWN → f (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