2013-09-16 15 views
22

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!

+8

'coalesce' è definito dallo standard SQL e funziona su quasi tutti i DBMS. 'isnull()' funziona solo con i prodotti Microsoft. –

+1

'ISNULL' accetta due parametri,' COALESCE' può assumere parametri 'n', dipende dal requisito e dalla versione di SQL Server rispetto a quale sia preferibile –

+0

MySQL ha anche nullo. –

risposta

46

Confrontando COALESCE e ISNULL

La funzione ISNULL e l'espressione COALESCE hanno uno scopo simile, ma può 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 di espressione CASE e restituisce il tipo di dati del valore con la precedenza più alta.
  3. 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

+3

+1. Inoltre, 'COALESCE' è solo una scorciatoia per un'espressione' CASE', il che significa che l'ottimizzatore lo riscrive per usare 'CASE' invece – Lamak

+0

@paxdiablo Books OnLine, la documentazione ufficiale di SQL Server. Scusate, non sono sicuro che lo chiamino ancora, ma lo era. – SchmitzIT

+1

Ah, grazie, ha molto più senso dei miei tentativi :-) – paxdiablo

0

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.

9

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.

4

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.

MSDN

+3

_ "' ISNULL 'è più veloce di' COALESCE'. "_ [citazione necessaria]. In quali casi? Perché? –