Confronto COALESCE e ISNULL
La funzione ISNULL e l'espressione COALESCE hanno uno scopo simile ma possono comportarsi in modo diverso.
- 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.
- 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.
- 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