La plupart des principaux SGBDR prennent en charge le COALESCE()
, qui renvoie la première valeur non nulle de sa liste d'arguments.
COALESCE()
est une fonctionnalité standard SQL (elle est incluse dans la spécification ISO/IEC 9075).
Syntaxe
La syntaxe ressemble à ceci :
COALESCE (V1, V2, ..., Vn)
Ainsi, au moins un argument est requis, mais plusieurs arguments peuvent être (et sont généralement) fournis.
COALESCE()
est considéré comme un n -opérateur adic. En d'autres termes, c'est un opérateur qui a un nombre variable d'opérandes (c'est-à-dire n opérandes).
Exemple
Voici un exemple simple pour illustrer :
SELECT COALESCE(null, 'Papaya', 'Salad');
Résultat :
Papaya
Dans ce cas, Papaya
était la première valeur non nulle, et donc COALESCE()
renvoyé cette valeur.
Salad
était également une valeur non nulle, mais elle venait après Papaya
et donc il n'a pas été retourné.
COALESCE()
vs CASE
COALESCE()
est généralement considéré comme un raccourci syntaxique pour le CASE
expression.
Ainsi, la déclaration suivante :
COALESCE (V1, V2)
est équivalent à :
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
Et la déclaration suivante :
COALESCE (V1, V2, ..., Vn)
(pour n ≥ 3) Est équivalent à :
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END
Lorsque toutes les valeurs sont nulles
Si toutes les valeurs sont null
, COALESCE()
renvoie null
:
SELECT COALESCE( null, null );
Résultat :
null
Selon votre SGBDR, la sortie réelle pour les valeurs nulles peut être différente. Par exemple, lors de l'utilisation de psql (pour PostgreSQL), la chaîne vide est générée par défaut chaque fois qu'une valeur nulle est renvoyée (bien que cela puisse être modifié). C'est la même chose avec SQLite (et cela peut aussi être changé).
Dans SQL Server, si tous les arguments sont null
, alors au moins une des valeurs nulles doit être un null
typé . Par conséquent, l'exemple ci-dessus entraîne en fait une erreur (car tous les arguments nuls sont null
constantes).
Expressions
COALESCE()
renvoie la valeur actuelle de la première expression qui initialement n'est pas évaluée à null
. Par conséquent, si nous passons une expression comme celle-ci :
SELECT COALESCE( null, 3 * 5 );
Nous obtenons ceci :
15
Exemple de base de données
Supposons que nous lancions la requête suivante :
SELECT
name,
salary
FROM employee;
Et nous obtenons le résultat suivant :
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | null
Nous pouvons voir que la dernière ligne a une valeur nulle dans le DOB
colonne.
Si nous voulions remplacer la valeur nulle par une autre valeur, nous pourrions utiliser COALESCE()
comme suit :
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Résultat :
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
Dans ce cas, nous avons remplacé toutes les valeurs nulles par l'entier 0
.
Différences entre les SGBDR
En général, COALESCE()
fonctionne à peu près de la même manière dans tous les SGBDR.
Mais il y a quelques différences.
Types de données
Nous pouvons effectuer les opérations suivantes dans MySQL, MariaDB et SQLite :
SELECT
name,
COALESCE(salary, 'None') AS salary
FROM employee;
Résultat :
name salary ----- ------ Elise 100000 Rohit 50000 Homer None
Dans ce cas, chaque fois que le salary
colonne contient une valeur nulle, la sortie est None
.
Mais cette requête peut causer des problèmes dans SQL Server, PostgreSQL ou Oracle Database.
Lorsque j'exécute cette requête dans SQL Server, PostgreSQL et Oracle Database, j'obtiens une erreur car la valeur de remplacement est le mauvais type de données.
Voici ce que SQL Server renvoie lorsque j'exécute la requête ci-dessus :
Msg 245, Level 16, State 1, Line 15 Conversion failed when converting the varchar value 'None' to data type int.
Voici ce que PostgreSQL renvoie :
ERROR: invalid input syntax for type integer: "None" LINE 3: COALESCE(salary, 'None') AS salary ^
Et voici ce que renvoie Oracle Database :
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
Mais si j'utilise une valeur numérique, je n'obtiens pas l'erreur :
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Résultat :
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
Donc, ce dernier exemple fonctionne sur les six SGBDR ci-dessus.
Arguments nuls
Une autre différence entre la façon dont les SGBDR traitent COALESCE()
est dans la façon dont ils traitent les arguments nuls.
Comme mentionné, dans SQL Server, si tous les arguments sont null
, alors au moins une des valeurs nulles doit être un null
typé . En d'autres termes, si tous les arguments de COALESCE()
sont la constante nulle, alors nous obtenons une erreur. Ce n'est pas le cas avec d'autres SGBDR, où tous les arguments peuvent être la constante nulle, et la sortie sera null
au lieu d'une erreur.