MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

SQL COALESCE() expliqué

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.