Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL - Differenza tra COALESCE e ISNULL?

Confronto COALESCE e ISNULL

La funzione ISNULL e l'espressione COALESCE hanno uno scopo simile ma possono comportarsi in modo diverso.

  1. Poiché ISNULL è una funzione, viene valutata solo una volta. Come descritto sopra, i valori di input per l'espressione COALESCE possono essere valutati più volte.
  2. La determinazione del tipo di dati dell'espressione risultante è diversa. ISNULL utilizza il tipo di dati del primo parametro, COALESCE segue le regole dell'espressione CASE e restituisce il tipo di dati di valore con la precedenza più alta.
  3. La capacità NULL dell'espressione del risultato è diversa per ISNULL e COALESCE. Il valore restituito ISNULL è sempre considerato NOT NULL (supponendo che il valore restituito sia non nullable) mentre COALESCE con parametri non null è considerato NULL. Quindi le espressioni ISNULL(NULL, 1) eCOALESCE(NULL, 1) sebbene equivalenti hanno valori di nullability diversi. Questo fa la differenza se stai usando queste espressioni colonne incalcolate, creando vincoli chiave o rendendo deterministico il valore restituito di una UDF scalare in modo che possa essere indicizzato come mostrato nell'esempio seguente.
> 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  );

Anche le convalide per ISNULL e COALESCE sono diverse. Ad esempio, un valore NULL per ISNULL viene convertito in int mentre per COALESCE è necessario fornire un tipo di dati. ISNULL accetta solo 2 parametri mentre COALESCE accetta un numero variabile di parametri.

Fonte:BOL