sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server COALESCE() explicado

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 el CASE 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 y COALESCE . El ISNULL 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 considera NULL .
  • Validaciones para ISNULL y COALESCE también son diferentes. Por ejemplo, un NULL valor para ISNULL se convierte a int aunque para COALESCE , debe proporcionar un tipo de datos.
  • ISNULL toma sólo dos parámetros. Por el contrario COALESCE 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.