Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL - Diferença entre COALESCE e ISNULL?


Comparando COALESCE e ISNULL

A função ISNULL e a expressão COALESCE têm uma finalidade semelhante, mas podem se comportar de maneira diferente.
  1. Como ISNULL é uma função, ela é avaliada apenas uma vez. Conforme descrito acima, os valores de entrada para a expressão COALESCE podem ser avaliados várias vezes.
  2. A determinação do tipo de dados da expressão resultante é diferente. ISNULL usa o tipo de dados do primeiro parâmetro, COALESCE segue as regras da expressão CASE e retorna o tipo de dados de valor com a precedência mais alta.
  3. A NULLability da expressão de resultado é diferente para ISNULL e COALESCE. O valor de retorno ISNULL é sempre considerado NOT NULLable (assumindo que o valor de retorno é um valor não anulável) enquanto COALESCE com parâmetros não nulos é considerado NULL. Portanto, as expressões ISNULL(NULL, 1) e COALESCE(NULL, 1), embora equivalentes, possuem valores de nulidade diferentes. Isso faz diferença se você estiver usando essas expressões em colunas computadas, criando restrições de chave ou tornando o valor de retorno de uma UDF escalar determinística para que ela possa ser indexada conforme mostrado no exemplo a seguir.
> USE tempdb; 
> GO

> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2 
> -- evaluates to NULL. 

> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0) PRIMARY KEY,  col3 AS ISNULL(col1, 0)  ); 
> 
> -- This statement succeeds because the nullability of the 
> -- ISNULL function evaluates AS NOT NULL.
> 
> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0), 
> col3 AS ISNULL(col1, 0) PRIMARY KEY  );

As validações para ISNULL e COALESCE também são diferentes. Por exemplo, um valor NULL para ISNULL é convertido em int, enquanto para COALESCE, você deve fornecer um tipo de dados. ISNULL aceita apenas 2 parâmetros, enquanto COALESCE recebe um número variável de parâmetros.

Fonte:BOL