Qualcuno può spiegare come funziona la funzione COALESCE in TSQL? La sintassi è la seguente
COALESCE (x, y)
Il documento MSDN su questa funzione è piuttosto vago
Qualcuno può spiegare come funziona la funzione COALESCE in TSQL? La sintassi è la seguente
COALESCE (x, y)
Il documento MSDN su questa funzione è piuttosto vago
Risposte:
Mi è stato detto che COALESCE è meno costoso di ISNULL, ma la ricerca non lo indica. ISNULL accetta solo due parametri, il campo valutato per NULL e il risultato desiderato se viene valutato come NULL. COALESCE prenderà un numero qualsiasi di parametri e restituirà il primo valore incontrato 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 attraverso tutti i parametri uno per uno e restituisce il primo che è 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 qualsiasi numero di parametri, ma dovrebbero essere lo stesso tipo di dati. (Se non sono lo stesso tipo di dati, viene eseguito il cast implicito a un tipo di dati appropriato utilizzando l'ordine di precedenza del tipo di dati .)
È come ISNULL()
se fosse per più parametri, piuttosto che solo per due.
È anche ANSI-SQL
dove-come ISNULL()
non lo è.
ISNULL
restituisca un valore con lo stesso tipo di dati del primo parametro, tuttavia
expressions
, confronti con CASE, confronti con ISNULL e infine un esempio senza risultato. Quindi un esempio eccessivamente complesso con troppi dettagli. Quando tutto ciò di cui abbiamo bisogno è questa risposta con 5-6 righe di WTF, questa cosa è e fa.
Ecco come vedo COALESCE ... e si spera 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 pezzo di codice di prova per il database di esempio AdventureWorks2012 funziona perfettamente e fornisce una buona spiegazione visiva di come funziona COALESCE :
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
C'è molto di più da fondere che un semplice sostituto di ISNULL. Sono completamente d'accordo che la "documentazione" ufficiale del 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 coalesce:
select * from person where coalesce(addressId, ContactId) is null.
Restituirà le persone in cui sia addressId che contactId sono nulli.
funzione di coalescenza
per esempio
La definizione più semplice 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 restituito un valore NULL.
Nota: valuta TUTTI i parametri, cioè non salta la valutazione dell'argomento (i) a destra del parametro restituito / NOT NULL.
Sintassi:
Coalesce(arg1, arg2, argN...)
Attenzione : a parte gli argomenti che restituiscono NULL, tutti gli altri argomenti (NOT-NULL) devono essere dello stesso tipo di dati o devono essere di tipi corrispondenti (che possono essere "convertiti automaticamente in modo implicito" in un tipo di dati compatibile), vedere esempi sotto:
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 of Date into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.
HTH
ISNULL
, non è standard, meno flessibile, ho letto che restituirà sempre il tipo di dati del primo argomento e non il tipo di dati del valore restituito comeCOALESCE
fa.