risposta-alla-domanda-sullo-sviluppo-web-bd.com

Funzione COALESCE in SQL

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

104
Lloyd Banks

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/

72
Bill Melius

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 è.

206
MatBailie

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
17
John Waclawski

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/

3
CindyPsych

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

  • prende almeno due argomenti.
  • gli argomenti devono essere di tipo intero.
  • restituisce il primo argomento non-null.

per esempio. 

  • coalesce (null, 1, 2, 3) restituirà 1.
  • coalesce (null, null) will restituisce null.
2

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

0
Eddie Kumar