Quali sono le differenze pratiche tra COALESCE() e ISNULL (, '')?SQL - Differenza tra COALESCE e ISNULL?
Quando si evitano valori NULL nelle concatenazioni SQL, quale è il migliore da utilizzare?
Grazie!
Quali sono le differenze pratiche tra COALESCE() e ISNULL (, '')?SQL - Differenza tra COALESCE e ISNULL?
Quando si evitano valori NULL nelle concatenazioni SQL, quale è il migliore da utilizzare?
Grazie!
Confrontando COALESCE e ISNULL
La funzione ISNULL e l'espressione COALESCE hanno uno scopo simile, ma può 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 di espressione CASE e restituisce il tipo di dati del valore con la precedenza più alta.
- La nullità dell'espressione risultato è diversa per ISNULL e COALESCE. Il valore di ritorno ISNULL è sempre considerato NON Nullabile (presupponendo che il valore di ritorno sia uno non ammesso a zero ) mentre COALESCE con parametri non nulli è considerato NULL. Quindi le espressioni ISNULL (NULL, 1) e COALESCE (NULL, 1) anche se equivalenti hanno valori diversi di valori Nullità . Ciò fa la differenza se si utilizzano queste espressioni nelle colonne calcolate , creando vincoli chiave o rendendo il valore restituito di un deterministico UDF scalare in modo che possa essere indicizzato come mostrato in 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 );
convalide per ISNULL e COALESCE sono anche diversi. Ad esempio, un valore NULL per ISNULL è convertito in int mentre per COALESCE, è necessario fornire un tipo di dati. ISNULL accetta solo 2 parametri mentre COALESCE prende una variabile numero di parametri.
Fonte: BOL
+1. Inoltre, 'COALESCE' è solo una scorciatoia per un'espressione' CASE', il che significa che l'ottimizzatore lo riscrive per usare 'CASE' invece – Lamak
@paxdiablo Books OnLine, la documentazione ufficiale di SQL Server. Scusate, non sono sicuro che lo chiamino ancora, ma lo era. – SchmitzIT
Ah, grazie, ha molto più senso dei miei tentativi :-) – paxdiablo
COALESCE()
può avere più ingressi e valuterà nell'ordine fino a quando uno di questi è non nullo come COALESCE(Col1, Col2, Col3, 'N/A')
. Si consiglia di utilizzare questo da MS invece di ISNULL()
ISNULL()
può avere solo un input, tuttavia è stato dimostrato che è leggermente più veloce di COALESCE.
La differenza principale è che COALESCE
è ANSI-standard, in modo da troverete anche in altri RDBMS, l'altra differenza è che si può dare un intero elenco di valori da controllare per COALESCE
che, a ISNULL
si può passare solo uno.
Perché ISNULL
è una funzione, viene valutata solo una volta. Come descritto sopra, i valori di input per l'espressione COALESCE
possono essere valutati più volte. COALESCE
si traduce fondamentalmente nell'espressione CASE
e ISNULL
è un built-in implementato nel motore del database.
ISNULL
è più veloce di COALESCE
.
_ "' ISNULL 'è più veloce di' COALESCE'. "_ [citazione necessaria]. In quali casi? Perché? –
'coalesce' è definito dallo standard SQL e funziona su quasi tutti i DBMS. 'isnull()' funziona solo con i prodotti Microsoft. –
'ISNULL' accetta due parametri,' COALESCE' può assumere parametri 'n', dipende dal requisito e dalla versione di SQL Server rispetto a quale sia preferibile –
MySQL ha anche nullo. –