caso contro isnull contro coalesce


9

Sto solo leggendo la documentazione per gli esami di SQL Server 2012 e ho visto il seguente punto:

caso contro isnull contro coalesce

Ora so COME usare ognuno ma non so QUANDO usare ciascuno. Per favore, qualche corpo potrebbe chiarire. Grazie.

Ps. Per favore, potremmo avere un tag per domande d'esame?


2
COALESCEè espanso CASEma ovviamente in una CASEdichiarazione che scrivi tu stesso puoi essere più flessibile nelle WHENcondizioni. Per ISNULLvs COALESCE correlati / duplicati?
Martin Smith,

in relazione sono d'accordo. ma non dup. Grazie per il commento :)
Stuart Blackler l'

Risposte:


10

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.


Grazie per la risposta completa così in fretta. Non avevo idea che l'ordine di precedenza fosse importante COALESCE. Grazie ancora
Stuart Blackler l'

1
CASEè tecnicamente un'espressione, non una funzione.
ypercubeᵀᴹ

1

ISNULL ti dà la possibilità di restituire 1 repalcement, COALESCE non è limitato a un valore, ad es. COALESCE(v1,v2,v3,v4,v5) Se V5 è l'unico valore che NON è NULL, verrà restituito

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.