ISNULL : disponible solo en SQL Server. Permite la prueba y el reemplazo de un valor NULL por otro.
COALESCE - estándar ANSI. Permite la prueba y la sustitución de un valor NULL con el primer valor no nulo en un conjunto de argumentos de longitud variable. Es importante tener en cuenta que los factores de precedencia del tipo de datos en este
-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1)
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')
En el ejemplo anterior, 'a' es el primer valor no nulo, pero los datos de caracteres tienen una precedencia menor que el entero.
Otra consideración entre ISNULL vs COALESCE es que se determina que ISNULL es NOT NULL mientras que el resultado de una llamada COALESCE es NULLable. Vea la publicación de JRJ ISNULL () <> COALESCE () Si bien eso puede parecer algo trivial, el optimizador de consultas puede hacer diferentes planes en función de la nulabilidad de una columna.
Puede probar fácilmente la nulabilidad de sus expresiones isnull / coalesce / case ejecutándola a través de dmo sys.dm_exec_describe_first_result_set
-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
DMO.*
FROM
sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO
CASO : también una función escalar estándar ANSI. Consideraría el uso de CASE sobre los dos anteriores cuando tengo una prueba que no se puede expresar en un escalar simple, pero esa es una respuesta bastante débil, lo admito.
COALESCE
se expande a,CASE
pero obviamente en unaCASE
declaración usted mismo puede ser más flexible en lasWHEN
condiciones. ParaISNULL
vsCOALESCE
relacionado / duplicado?