ISNULL : disponibile solo in SQL Server. Consente il test e la sostituzione di un valore NULL tra loro.
COALESCE - ANSI standard. Consente il test e la sostituzione di un valore NULL con il primo valore non null in un set di argomenti a lunghezza variabile. È importante notare che la precendenza del tipo di dati tiene conto di ciò
-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1)
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')
Nell'esempio sopra, "a" è il primo valore non nullo ma i dati dei caratteri hanno una precedenza inferiore rispetto all'intero.
Un'altra considerazione tra ISNULL e COALESCE è che il risultato di ISNULL è determinato come NON NULL mentre l'esito di una chiamata COALESCE è NULLable. Vedi il post di JRJ ISNULL () <> COALESCE () Sebbene ciò possa sembrare una cosa banale, Query Optimizer può fare piani diversi in base alla nullità di una colonna.
Puoi facilmente testare la nullità delle tue espressioni isnull / coalesce / case eseguendolo attraverso il dmo sys.dm_exec_describe_first_result_set
-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
DMO.*
FROM
sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO
CASO - Anche una funzione scalare standard ANSI. Vorrei usare CASE rispetto ai due precedenti quando ho un test che non può essere espresso in un semplice scalare ma è una risposta piuttosto debole, lo ammetto.
COALESCE
è espansoCASE
ma ovviamente in unaCASE
dichiarazione che scrivi tu stesso puoi essere più flessibile nelleWHEN
condizioni. PerISNULL
vsCOALESCE
correlati / duplicati?