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

SQL:¿diferencia entre COALESCE e ISNULL?

Comparando COALESCE y ISNULL

La función ISNULL y la expresión COALESCE tienen un propósito similar pero pueden comportarse de manera diferente.

  1. Debido a que ISNULL es una función, se evalúa solo una vez. Como se describió anteriormente, los valores de entrada para la expresión COALESCE se pueden evaluar varias veces.
  2. 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 las reglas de expresión CASE y devuelve el tipo de datos de valor con la prioridad más alta.
  3. La capacidad NULL de la expresión de resultado es diferente para ISNULL y COALESCE. El valor devuelto por ISNULL siempre se considera NOT NULLable (suponiendo que el valor devuelto no sea anulable) mientras que COALESCE con parámetros no nulos se considera NULL. Entonces, las expresiones ISNULL(NULL, 1) y COALESCE(NULL, 1), aunque equivalentes, tienen diferentes valores de nulabilidad. Esto marca la diferencia si usa estas expresiones en columnas calculadas, crea restricciones clave o hace que el valor de retorno de una UDF escalar sea determinista para que pueda indexarse ​​como se muestra en el siguiente ejemplo.
> USE tempdb; 
> GO

> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2 
> -- evaluates to NULL. 

> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0) PRIMARY KEY,  col3 AS ISNULL(col1, 0)  ); 
> 
> -- This statement succeeds because the nullability of the 
> -- ISNULL function evaluates AS NOT NULL.
> 
> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0), 
> col3 AS ISNULL(col1, 0) PRIMARY KEY  );

Las validaciones para ISNULL y COALESCE también son diferentes. Por ejemplo, un valor NULL para ISNULL se convierte en int mientras que para COALESCE, debe proporcionar un tipo de datos. ISNULL toma solo 2 parámetros mientras que COALESCE toma una cantidad variable de parámetros.

Fuente:BOL