sql >> Base de Datos >  >> NoSQL >> MongoDB

SQL COALESCE() explicado

La mayoría de los principales RDBMS son compatibles con COALESCE() operador, que devuelve el primer valor no nulo de su lista de argumentos.

COALESCE() es una característica estándar de SQL (está incluida en la especificación ISO/IEC 9075).

Sintaxis

La sintaxis es así:

COALESCE (V1, V2, ..., Vn)

Por lo tanto, se requiere al menos un argumento, pero se pueden proporcionar (y generalmente se proporcionan) múltiples argumentos.

COALESCE() se considera un n -operador ádico. En otras palabras, es un operador que tiene un número variable de operandos (es decir, n operandos).

Ejemplo

Aquí hay un ejemplo simple para demostrarlo:

SELECT COALESCE(null, 'Papaya', 'Salad');

Resultado:

Papaya

En este caso, Papaya fue el primer valor no nulo, por lo que COALESCE() devolvió ese valor.

Salad también era un valor no nulo, pero venía después de Papaya por lo que no fue devuelto.

COALESCE() vs CASE

COALESCE() normalmente se considera un atajo sintáctico para CASE expresión.

Como tal, la siguiente declaración:

COALESCE (V1, V2) 

es equivalente a:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END

Y la siguiente declaración:

COALESCE (V1, V2, ..., Vn)

(para n ≥ 3) Es equivalente a:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END

Cuando todos los valores son nulos

Si todos los valores son null , COALESCE() devuelve null :

SELECT COALESCE( null, null );

Resultado:

null

Dependiendo de su RDBMS, la salida real para valores nulos puede ser diferente. Por ejemplo, cuando se usa psql (para PostgreSQL), la cadena vacía se genera de forma predeterminada cada vez que se devuelve un valor nulo (aunque esto se puede cambiar). Es lo mismo con SQLite (y esto también se puede cambiar).

En SQL Server, si todos los argumentos son null , entonces al menos uno de los valores nulos debe ser un null escrito . Por lo tanto, el ejemplo anterior en realidad da como resultado un error (porque todos los argumentos nulos son null constantes).

Expresiones

COALESCE() devuelve el valor actual de la primera expresión que inicialmente no se evalúa como null . Por lo tanto, si pasamos una expresión como esta:

SELECT COALESCE( null, 3 * 5 );

Obtenemos esto:

15

Ejemplo de base de datos

Supongamos que ejecutamos la siguiente consulta:

SELECT
  name,
  salary
FROM employee;

Y obtenemos el siguiente resultado:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |   null

Podemos ver que la última fila tiene un valor nulo en el DOB columna.

Si quisiéramos reemplazar el valor nulo con otro valor, podríamos usar COALESCE() de la siguiente manera:

SELECT
  name,
  COALESCE(salary, 0) AS salary
FROM employee;

Resultado:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |      0

En este caso, reemplazamos todos los valores nulos con el número entero 0 .

Diferencias entre RDBMS

En general, COALESCE() funciona más o menos igual en todos los RDBMS.

Pero hay algunas diferencias.

Tipos de datos

Podemos hacer lo siguiente en MySQL, MariaDB y SQLite:

SELECT
  name,
  COALESCE(salary, 'None') AS salary
FROM employee;

Resultado:

name	salary
-----   ------
Elise	100000
Rohit	50000
Homer	None

En este caso, siempre que el salary columna contiene un valor nulo, el resultado es None .

Pero esa consulta puede causar problemas en SQL Server, PostgreSQL u Oracle Database.

Cuando ejecuto esa consulta en SQL Server, PostgreSQL y Oracle Database, aparece un error debido a que el valor de sustitución es del tipo de datos incorrecto.

Esto es lo que devuelve SQL Server cuando ejecuto la consulta anterior:

Msg 245, Level 16, State 1, Line 15
Conversion failed when converting the varchar value 'None' to data type int.

Esto es lo que devuelve PostgreSQL:

ERROR:  invalid input syntax for type integer: "None"
LINE 3:   COALESCE(salary, 'None') AS salary
                           ^

Y esto es lo que devuelve Oracle Database:

ORA-00932: inconsistent datatypes: expected NUMBER got CHAR

Pero si uso un valor numérico, no obtengo el error:

SELECT
  name,
  COALESCE(salary, 0) AS salary
FROM employee;

Resultado:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |      0

Entonces, este último ejemplo funciona en los seis RDBMS anteriores.

Argumentos nulos

Otra diferencia entre cómo los RDBMS procesan COALESCE() está en cómo tratan los argumentos nulos.

Como se mencionó, en SQL Server, si todos los argumentos son null , entonces al menos uno de los valores nulos debe ser un null escrito . En otras palabras, si todos los argumentos de COALESCE() son la constante nula, entonces obtenemos un error. Este no es el caso con otros RDBMS, donde todos los argumentos pueden ser la constante nula y la salida será null en lugar de un error.