Diferença entre ISNULL x Coalesce

Bom Dia Pessoal,
Há algumas semanas atrás em um fórum que participo houve a duvida de uma pessoa que queria substituir valores nulos por qualquer outro valor, instrui ele a utilizar a função coalesce ou a isnull. Bom até ai tudo bem temos duas funções conhecidas: ISNULL (Implementação Microsoft) e Coalesce (Padrão ANSI).
Assim que respondi essa questão uma duvida me apareceu: Qual a diferença entre ISNULL e Coalesce? Primeiramente fui ao twitter e perguntei para o @sqlservian ele logo me respondeu e me mandou alguns links, vou compartilhar e espero que fique bem entendida a diferença.

Primeiramente como citei acima a primeira diferença é que Coalesce é padrão ANSI e ISNULL é implementação da Microsoft o T-SQL. Eles fornecem o mesmo resultado porem com algumas diferenças.
A função ISNULL aceita somente 2 parâmetros, o primeiro que é o campo a ser verificado e o segundo o valor que ele deverá inserir em um registro nulo, outras particularidades são que a função ISNULL ao contrario da coalesce aceita verificação de tipos de dados diferentes.
Já a função coalesce consegue trabalhar com dois ou mais argumentos e também outro fator é que se o primeiro parâmetro for do tipo varchar o segundo parâmetro não poderá ser do tipo inteiro, ou seja, terá que ser do tipo varchar também, o mesmo acontece caso realizarmos o inverso (primeiro tipo de dado inteiro, segundo varchar). Abaixo veremos exemplos.
create table WMW (id tinyint, nome varchar (20), email varchar (20),
endereco varchar (50), telefone varchar (30))

insert into WMW (id,nome,email,endereco,telefone) values (1,’Marcos’,’marcos@msn.com’,’Estrada Geral 1′,’0000′)
insert into WMW (id,nome,email,telefone) values (2,’Daniel’,’daniel@msn.com’,’1111′)
insert into WMW(id,nome,endereco,telefone) values (3,’Emerson’,’Estrada Geral 3′, ‘2222’)
insert into WMW(id,email,endereco,telefone) values (4,’julio@msn.com’,’Estrada Geral 4′, ‘3333’)
insert into WMW(nome,email,endereco,telefone) values (‘Pedro’,’pedro@msn.com’,’Estrada Geral 5′,’4444′)
insert into WMW(id,nome,email,endereco,telefone) values (6,’Cassiano’,’cassiano@msn.com’,’Estrada Geral 6′,’5555′)
insert into WMW(id,nome,email,endereco) values (7,’Richard’,’richard@msn.com’,’Estrada Geral 7′)

Criado as tabelas e inserido os dados vamos ver na pratica a diferença entre um e outro.
Verificando a função ISNULL:

Se analisarmos o registro de código 3 não possui e-mail cadastrado então vamos aplicar o seguinte select para formatar a saida: select id,nome, ISNULL(email,’Não possui e-mail’) as ‘E-mail’ ,endereco,telefone from WMW
where id=3

Onde o resultado será:
id nome E-mail endereco Telefone
3 Emerson Não Possui e-mail Estrada Geral 3 2222

Verifique agora que se tentarmos colocar na função mais parâmetros para verificação o seguinte erro acontece:

select id,nome, ISNULL(email,endereco,’Não possui e-mail’) as ‘E-mail’ ,endereco,telefone from WMW
where id=8
Resultado:
Msg 174, Level 15, State 1, Line 1
The isnull function requires 2 argument(s).

Como eu tinha mencionado anteriormente a função aceita somente dois parâmetros.
Verificando a função Coalesce.

select id,nome,coalesce(email, endereco,’Não Achou Valor’) as email,telefone
from WMW

O que será feito nesse select é: Percorrer toda a tabela e quando encontrar o primeiro valor nulo dentro do campo e-mail o mesmo será substituído pelo valor dentro do campo endereço, e quando encontrar alguma linha sem e-mail e endereço com valor nulo ele substituirá pela frase ‘Não Achou Valor’.

Para provar que a função coalesce não trabalha com tipo de dados varchar no primeiro parâmetro e inteiro no segundo parâmetro, e vice-versa, abaixo vai um select que simula o erro.

select ID,nome,coalesce(nome,1) from WMW
Resultado:
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value ‘Marcos’ to data type int.

E ao contrário o erro permanece:
select ID,nome,coalesce(id,’Sem Valor’) from WMW
Resultado:
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value ‘Sem Valor’ to data type tinyint.

Bom por hoje é isso, espero que tenham entendido a diferença entre eles.
Valeu e até mais.

Sobre Marcos Freccia

MVP em SQL Server (Data Plataform) , especialista em SQL Server, e atualmente trabalhando com Microsoft Azure!

Publicado em dezembro 10, 2010, em Desenvolvimento, VirtualPass e marcado como , , . Adicione o link aos favoritos. 1 comentário.

  1. Muito bom meu caro! Muito útil!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: