En SQL Server, COALESCE()
expresión devuelve su primer argumento no nulo.
La forma en que funciona es que pasamos una lista de argumentos a la expresión, evalúa los argumentos en orden y devuelve el valor actual de la primera expresión que inicialmente no se evalúa como NULL
.
Sintaxis
La sintaxis es así:
COALESCE ( expression [ ,...n ] )
Ejemplo
Aquí hay un ejemplo simple para demostrarlo:
SELECT COALESCE(null, 'Cat', 'Dog');
Resultado:
Cat
En este caso, Cat
fue el primer argumento no NULL, por lo que COALESCE()
devolvió ese valor.
Expresiones
Como se mencionó, 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, 2 * 3 );
Obtenemos esto:
6
La función devuelve el tipo de datos de la expresión con la prioridad de tipo de datos más alta. Si todas las expresiones son no anulables, el resultado se escribe como no anulable.
Cuando todos los argumentos son NULL
Si todos los argumentos son NULL
, COALESCE()
devuelve NULL
. Sin embargo, al menos uno de los valores nulos debe ser un NULL
escrito , de lo contrario se produce un error.
En otras palabras, no todos pueden ser NULL
constante:
SELECT COALESCE( null, null );
Obtenemos esto:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
En este caso, todos los argumentos eran NULL
constante, por lo que se devolvió un error.
A continuación se muestra un ejemplo de base de datos para demostrar un escenario donde COALESCE()
devuelve NULL
cuando todos los argumentos son NULL
.
Supongamos que ejecutamos la siguiente consulta:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Resultado:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Ambas columnas contienen NULL
valores.
Entonces, si pasamos ambas columnas a COALESCE()
, obtenemos un resultado de NULL
:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Resultado:
NULL
Lo mismo es cierto si reemplazamos una de las columnas con NULL
constante:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Resultado:
NULL
Entonces es solo cuando todos los argumentos son NULL
constante que obtenemos un error.
Reemplazar NULL
Resultados con un valor conocido
Podemos incluir un valor conocido como último argumento para reemplazar cualquier resultado NULL con ese valor conocido.
Por ejemplo, la siguiente consulta devuelve NULL
:
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals;
Resultado:
NULL
En este caso, el UnitPrice
columna contiene valores NULL en todas las filas, por lo que el resultado fue NULL
.
Podemos usar COALESCE()
así:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;
Resultado:
0.00
Ahora, el resultado NULL se reemplaza con un valor conocido (cero).
COALESCE()
vs CASE
El COALESCE()
expresión es en realidad un atajo sintáctico para CASE
expresión. Cuando usamos COALESCE()
expresión, el optimizador de consultas la reescribe como CASE
expresión.
Cuando ejecuto la siguiente instrucción:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
El optimizador de consultas lo reescribe de la siguiente manera:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END
COALESCE()
vs ISNULL()
De alguna manera, el COALESCE()
la expresión es similar a ISNULL()
función. Pero hay diferencias. En particular:
ISNULL()
es una función y se evalúa una sola vez.COALESCE()
por otro lado, es una expresión y potencialmente puede evaluarse varias veces.- La determinación del tipo de datos de la expresión resultante es diferente.
ISNULL
usa el tipo de datos del primer parámetro,COALESCE
sigue elCASE
reglas de expresión y devuelve el tipo de datos de valor con la prioridad más alta. - La capacidad NULL de la expresión de resultado es diferente para
ISNULL
yCOALESCE
. ElISNULL
el valor devuelto siempre se considera NO NULLable (suponiendo que el valor devuelto no sea NULLable). Por el contrario,COALESCE
con parámetros no nulos se consideraNULL
. - Validaciones para
ISNULL
yCOALESCE
también son diferentes. Por ejemplo, unNULL
valor paraISNULL
se convierte aint
aunque paraCOALESCE
, debe proporcionar un tipo de datos. ISNULL
toma sólo dos parámetros. Por el contrarioCOALESCE
toma un número variable de parámetros.
Más información
Consulte la documentación de Microsoft para obtener más detalles y ejemplos más complejos.