Qualcuno può spiegare come funziona la funzione COALESCE in SQL? La sintassi è la seguente
Il documento MSDN su questa funzione è piuttosto vago
The MSDN document on this function is pretty vague
Mi è stato detto che COALESCE è meno costoso di ISNULL, ma la ricerca non lo indica. ISNULL accetta solo due parametri, il campo viene valutato per NULL e il risultato desiderato se viene valutato come NULL. COALESCE prenderà un numero qualsiasi di parametri e restituirà il primo valore rilevato che non è NULL.
C'è una descrizione molto più approfondita dei dettagli qui http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
Non sono sicuro del motivo per cui pensi che la documentazione sia vaga.
Passa semplicemente tutti i parametri uno alla volta e restituisce il primo NOT NULL
.
COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1
COALESCE(1, 2, 3, 4, 5, NULL)
=> 1
COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3
COALESCE(6, 5, 4, 3, 2, NULL)
=> 6
COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL
Accetta praticamente un numero qualsiasi di parametri, ma dovrebbero essere dello stesso tipo di dati. (Se non sono dello stesso tipo di dati, vengono convertiti implicitamente in un tipo di dati appropriato usando tipo di ordine di precedenza di tipo di dati .)
È come ISNULL()
ma per più parametri, piuttosto che solo due.
È anche ANSI-SQL
, dove -come ISNULL()
non lo è.
Ecco come guardo COALESCE ... e spero che abbia senso ...
In una forma semplicistica ...
Coalesce (FieldName, 'Empty')
Quindi questo si traduce in ... Se "FieldName" è NULL, popolare il valore del campo con la parola "EMPTY".
Ora per più valori ...
Coalesce (FieldName1, FieldName2, Value2, Value3)
Se il valore in Fieldname1 è null, riempirlo con il valore in Fieldname2, se FieldName2 è NULL, riempirlo con Value2, ecc.
Questo codice di prova per il database di esempio AdventureWorks2012 funziona perfettamente e fornisce una buona spiegazione visiva di come COALESCE funziona:
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
C'è molto di più da aggiungere alla sostituzione di ISNULL. Sono completamente d'accordo sul fatto che la "documentazione" ufficiale della coalesce sia vaga e inutile. Questo articolo aiuta molto. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
Ecco una semplice query contenente coalizione -
select * from person where coalesce(addressId, ContactId) is null.
Restituirà le persone dove sia addressId che contactId sono null.
funzione di coalesce
per esempio.
La più semplice definizione della funzione Coalesce () potrebbe essere:
La funzione Coalesce () valuta tutti gli argomenti passati, quindi restituisce il valore della prima istanza dell'argomento che non ha valutato un valore NULL.
Nota: valuta TUTTI i parametri, cioè non salta la valutazione dell'argomento (i) sul lato destro del parametro restituito/NOT NULL.
Sintassi:
Coalesce(arg1, arg2, argN...)
Attenzione: Escludendo quegli argomenti che valutano a NULL, tutti gli altri argomenti (NOT-NULL) passati devono essere dello stesso tipo di dati o devono essere di matching-types (che può essere " implicitamente convertito automaticamente "in un tipo di dati compatibile), vedere esempi di seguito:
PRINT COALESCE(NULL, ('str-'+'1'), 'x') --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3) --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99) --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.
DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31') --returns today's date, works fine as implicit conversion into DATE type occurs.
--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type
HTH