Quantidade de parâmetros da função
Retornar o primeiro valor não-nulo de cada linha ou 0, se todas as colunas forem NULL
-- COM ISNULL
SELECT
ISNULL(Coluna1, ISNULL(Coluna2, ISNULL(Coluna3, 0)))
FROM
-- COM COALESCE
SELECT
COALESCE(Coluna1, Coluna2, Coluna3, 0)
FROM
Como podemos observar no código acima, a função ISNULL aceita apenas um parâmetro de entrada, que pode ser uma coluna ou um valor, e um parâmetro para você definir o valor de substituição caso o primeiro parâmetro seja nulo. Caso você queira fazer comparações entre várias colunas/valores, terá que utilizar a função várias vezes, aninhadamente.
Já a função COALESCE, aceita vários parâmetros de entrada (no mínimo 2 parâmetros e sem máximo definido), tornando o uso dessa função mais simples do que a ISNULL.
Tipo de dado do retorno
Uma diferença que muitas pessoas acabam não percebendo é com relação ao tipo de dados do retorno: Enquanto a função ISNULL considera o tipo de dados da primeira coluna como o tipo de dados do retorno da função, o tipo de dados do retorno da função COALESCE será o mesmo tipo de dados do parâmetro que será retornado (o primeiro não-nulo).
Na prática, esse cenário faz com que as duas funções tenham um comportamento muito diferente.
Criação da base de testes
IF (OBJECT_ID('tempdb..#Teste2') IS NOT NULL) DROP TABLE #Teste2
CREATE TABLE #Teste2 (
Codigo INT,
Valor VARCHAR(100)
)
INSERT INTO #Teste2
VALUES(1, '255.55'), (1, '0'), (2, '1'), (3, '1.99'), (4, NULL)
Retornando o maior valor da tabela agrupado por codigo:
SELECT Codigo, MAX(Valor)
FROM #Teste2
GROUP BY Codigo
Veja que o código 4 retornou como NULL, para que não apareça NULL e sim 0
SELECT Codigo, MAX(ISNULL(Valor, 0))
FROM #Teste2
GROUP BY Codigo
o retorno da função ISNULL considera o tipo de dados do primeiro parâmetro, que é a coluna Valor (VARCHAR). Então o retorno da função, é o valor ‘0’ (zero convertido para string).
Já na função COALESCE, o tipo de dados de retorno é o mesmo do primeiro valor não-nulo, que seria o valor inteiro 0 (zero). E com isso, o SQL irá gerar uma mensagem de erro ao tentar converter o valor ‘255.55’ (como string) para o tipo de dados inteiro (int)
Caso você ainda queira utilizar a função COALESCE, você terá que converter os parâmetros de entrada para um tipo em comum que todos os parâmetros possam ser convertidos pelo SQL Server.
SELECT
Codigo,
MAX(
COALESCE(
CAST(Valor AS NUMERIC(18, 2)
), 0)
)
FROM
GROUP BY
Codigo
Nulidade do retorno da função
Outra diferença que as pessoas não se atentam, é em relação à nulidade do retorno da função. A nulidade retornada pela função ISNULL é sempre do tipo não-nulo (NOT NULL) (supondo que o valor retornado não seja nulo). Por outro lado, a função COALESCE sempre retorna os dados com o tipo nulo (NULL), mesmo que a função retorne um valor não-nulo.
Para ficar mais fácil de demonstrar, vou preparar dois exemplos para você visualizar isso melhor:
Exemplo 1 Criarei uma tabela e utilizarei colunas calculadas com as funções ISNULL e COALESCE.
IF (OBJECT_ID('tempdb..#Teste2') IS NOT NULL) DROP TABLE #Teste2
CREATE TABLE #Teste2 (
Valor VARCHAR(100) NOT NULL,
ValorNaoNulo1 AS (ISNULL(Valor, 0)),
ValorNaoNulo2 AS (COALESCE(Valor, 0)),
)
Observando o tipo de dados e opções de nulidade dessas colunas:
SELECT
A.[name],
A.column_id,
C.[name],
A.max_length,
A.[precision],
A.scale,
A.is_nullable
FROM
tempdb.sys.columns A
JOIN tempdb.sys.tables B ON A.[object_id] = B.[object_id]
JOIN tempdb.sys.types C ON A.system_type_id = C.user_type_id
WHERE
B.[name] LIKE '#Teste2%';
Como podemos observar acima, o tipo de dados da função ISNULL seguiu o mesmo tipo do primeiro parâmetro (Coluna Valor = VARCHAR(100)), enquanto a função COALESCE utilizou como tipo de retorno, o tipo do primeiro parâmetro que garantidamente não será nulo, que foi o valor 0 (zero), um inteiro.
Além disso, a coluna calculada criada utilizando a função ISNULL, foi criada com a nulidade determinada como não nula (NOT NULL), enquanto a coluna criada utilizando a função COALESCE foi criada com a nulidade nula (NULL), mesmo que ela sempre retorne um valor não-nulo por causa do último parâmetro ser um valor fixo 0.
Ou seja, mesmo que a função COALESCE sempre retorne um valor não-nulo nesse exemplo, a nulidade da coluna foi definida como aceitando valores nulos.