ISNULL - disponível apenas no SQL Server. Permite testar e substituir um valor NULL um pelo outro.
COALESCE - padrão ANSI. Permite o teste e a substituição de um valor NULL pelo primeiro valor não nulo em um conjunto de argumentos de tamanho variável. É importante observar que fatores de precedência do tipo de dados neste
-- 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')
No exemplo acima, 'a' é o primeiro valor não nulo, mas os dados dos caracteres têm precedência menor que o número inteiro.
Outra consideração entre ISNULL vs COALESCE é o resultado de ISNULL NÃO é NULL, enquanto o resultado de uma chamada COALESCE é NULLable. Veja a publicação de JRJ ISNULL () <> COALESCE () Embora isso possa parecer trivial, o otimizador de consultas pode fazer planos diferentes com base na nulidade de uma coluna.
Você pode testar facilmente a nulidade de suas expressões isnull / coalesce / case executando-a no 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
CASE - Também uma função escalar padrão ANSI. Eu usaria o CASE nos dois anteriores quando tenho um teste que não pode ser expresso em um escalar simples, mas essa é uma resposta bastante fraca, admito.
COALESCE
é expandido para,CASE
mas obviamente, em umaCASE
declaração que você mesmo escreve, pode ser mais flexível nasWHEN
condições. ParaISNULL
vsCOALESCE
relacionado / duplicado?