Como Mark apontou, você será pressionado a encontrar diferenças de desempenho; Eu acho que outros fatores serão mais importantes. Para mim, eu sempre uso COALESCE, e a maior parte disso já foi mencionada por você ou por Mark:
- COALESCE é o padrão ANSI. É uma coisa a menos com a qual preciso me preocupar se vou portar meu código. Para mim, pessoalmente, isso não é tão importante, porque sei com que frequência essas portas acontecem fora do mundo das salas de aula da Celko, mas para algumas pessoas isso é um benefício.
- Ao contrário do que você disse sobre legibilidade, acho que pode ser mais difícil ler ISNULL, especialmente para usuários provenientes de outros idiomas ou plataformas em que ISNULL retorna um booleano (que não existe no SQL Server). É verdade que COALESCE é mais difícil de soletrar, mas pelo menos não leva a suposições incorretas.
- COALESCE é muito mais flexível, como posso dizer COALESCE (a, b, c, d) enquanto que com ISNULL eu teria que fazer muitos aninhamentos para conseguir a mesma coisa.
Você também deve ter certeza de que está ciente de como a precedência do tipo de dados é tratada usando as duas funções, se você estiver usando com diferentes tipos de dados / precisões, etc.
Nota
Há uma exceção. Eles são tratados de maneira diferente nas versões atuais do SQL Server:
SELECT COALESCE((SELECT some_aggregate_query),0);
SELECT ISNULL((SELECT some_aggregate_query),0);
A COALESCE
variante, na verdade, será executada some_aggregate_query
duas vezes (uma vez para verificar o valor e outra para retorná-lo quando diferente de zero), enquanto ISNULL
só executará a subconsulta uma vez. Eu falo sobre algumas outras diferenças aqui:
COALESCE
é avaliada duas vezes.