Funzione COALESCE in TSQL


109

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:


74

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/


6
Attenzione all'uso 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 come COALESCEfa.
pignone

215

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-SQLdove-come ISNULL()non lo è.


4
+1 Per la tua spiegazione sulla precedenza dei tipi di dati. Credo che ISNULLrestituisca un valore con lo stesso tipo di dati del primo parametro, tuttavia
Lamak

5
Il tuo ultimo esempio di codice dovrebbe fornire l'errore "Almeno uno degli argomenti di COALESCE deve essere un NULL digitato" Fonte: sql-server-performance.com/2007/…
maqk

2
La documentazione dice molto mentre riesce anche a fornire un valore quasi zero. Una buona documentazione fornisce un semplice esempio con un risultato semplice. Coalesce si sposta immediatamente in 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.
P.Brian.Mackey


18

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

4

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/


3
Quell'articolo a cui ti sei collegato è estremamente fuorviante (come sottolineato da diverse persone, compreso l'autore, nella sezione commenti). Tutti i trucchi che mette in evidenza possono essere TUTTI fatti usando ISNULL al posto di coalesce.
Hobo Spider

3

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

  • richiede almeno due argomenti.
  • gli argomenti devono essere di tipo intero.
  • restituisce il primo argomento non nullo.

per esempio

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

1

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


0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str

1
Ho scoperto che questo è molto più semplice.
Xiao
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.