Corso
Quando lavori con dati reali, i valori mancanti sono quasi inevitabili. Che tu stia ripulendo dataset o unendo colonne, SQL offre una soluzione semplice ma potente: la funzione COALESCE(). Questo tutorial ti mostra come funziona COALESCE(), quando usarla e come applicarla con esempi pratici—il tutto in poche righe di SQL.
Che cos’è COALESCE() in SQL?
La funzione COALESCE() in SQL restituisce il primo valore non null da un elenco di espressioni. Se tutti i valori sono null, restituisce null. È comunemente usata per gestire valori mancanti o combinare più colonne in un unico output di fallback.
Quando dovresti usare COALESCE()?
Questa funzione è utile quando si combinano i valori di più colonne in una sola.
Per esempio, una tabella chiamata users contiene i valori di work_email e personal_email degli utenti.
Usando la funzione COALESCE(), possiamo creare una colonna chiamata email che mostra il work_email dell’utente se non è null. Altrimenti, mostra personal_email.
|
|
|
|
|
|
1 |
angel@datacamp.com |
null |
angel@datacamp.com |
|
2 |
null |
bruce@gmail.com |
bruce@gmail.com |
|
3 |
cath@datacamp.com |
cath@gmail.com |
cath@datacamp.com |
Sintassi di COALESCE()
COALESCE(value_1, value_2, ...., value_n)
La funzione COALESCE() accetta almeno un valore (value_1). Restituisce il primo valore non null nell’elenco, da sinistra a destra.
Per esempio, verificherà prima se value_1 è null. In caso contrario, restituisce value_1. Altrimenti controlla se value_2 è null. Il processo continua fino alla fine dell’elenco.
COALESCE() può essere usata con colonne, espressioni o costanti.
Esempi pratici di COALESCE()
Esegui e modifica il codice da questo tutorial online
Esegui codiceEsempio 1: Sostituire null con una costante
Considera la tabella countries con un elenco di paesi e le rispettive feste nazionali. Alcuni valori del giorno nazionale sono null. COALESCE() riempie i valori mancanti in national_day con la stringa costante 'Unknown'.
SELECT
country_id,
name,
national_day,
COALESCE(national_day, 'Unknown') AS national_day_coalesced
FROM countries
ORDER BY country_id
I risultati sono i seguenti:
|
|
|
|
|
|
1 |
Aruba |
null |
Unknown |
|
2 |
Afghanistan |
1919-08-19T00:00:00.000Z |
1919-08-19 |
|
3 |
Angola |
1975-11-11T00:00:00.000Z |
1975-11-11 |
|
4 |
Anguilla |
1967-05-30T00:00:00.000Z |
1967-05-30 |
Nota come il valore null in national_day sia sostituito dalla costante Unknown.
Esempio 2: Scegliere tra due colonne
Abbiamo una tabella chiamata products. Contiene il nome del prodotto e la sua descrizione. Alcune descrizioni sono troppo lunghe (più di 60 caratteri). In quel caso, sostituiamo la descrizione con il nome del prodotto.
La query seguente usa CASE per convertire le descrizioni lunghe in NULL, poi usa COALESCE() per ripiegare sul nome del prodotto.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE WHEN
LENGTH(description) >= 60
THEN NULL
ELSE description
END,
product_name) product_name_or_description
FROM products
I risultati sono i seguenti:
product_name |
|
|
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:14Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:15Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
Asus X99-E-10G WS |
"CPU:LGA2011-3,Form Factor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
"CPU:LGA2011-3,Form Factor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
|
Supermicro X9SRH-7TF |
"CPU:LGA2011,Form Factor:ATX,RAM Slots:8,Max RAM:64GB" |
"CPU:LGA2011,Form Factor:ATX,RAM Slots:8,Max RAM:64GB" |
Nota come la colonna product_name_or_description mostri il product_name se la description è lunga. Altrimenti, mostra la description.
Esempio 3: Logica di fallback con più colonne
Possiamo fare un passo oltre l’esempio 2. Supponiamo che al momento ci siano due requisiti:
- Se la lunghezza della
descriptionè inferiore a 60, allora mostra ladescription. - Altrimenti, controlla se la lunghezza di
product_nameè inferiore a 20. Se lo è, mostriamo ilproduct_name. - Altrimenti, mostra
product.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE
WHEN LENGTH(description) > 50
THEN NULL
ELSE description
END,
CASE
WHEN LENGTH(product_name) > 14
THEN NULL
ELSE product_name
END,
'product') AS product_name_or_description
FROM products
ORDER BY product_name
I risultati sono i seguenti:
|
|
|
|
|
ADATA ASU800SS-128GT-C |
Series:Ultimate SU800,Type:SSD,Capacity:128GB,Cache:N/A |
product |
|
ADATA ASU800SS-512GT-C |
Series:Ultimate SU800,Type:SSD,Capacity:512GB,Cache:N/A |
product |
|
AMD 100-5056062 |
Chipset:Vega Frontier Edition Liquid,Memory:16GBCore Clock:1.5GHz |
product |
|
AMD 100-505989 |
Chipset:FirePro W9100,Memory:32GBCore Clock:930MHz |
Chipset:FirePro W9100,Memory:32GBCore Clock:930MHz |
Nota come la colonna product_name_or_description mostri il product_name oppure la description a seconda delle lunghezze di product_name o description.
Motori SQL supportati
COALESCE() funziona in SQL Server (a partire dal 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse, BigQuery e Amazon RedShift.
Funzioni SQL correlate
Considerazioni finali
La funzione COALESCE() è uno strumento versatile per gestire i valori null e semplificare le tue query SQL. Che tu stia sostituendo dati mancanti con valori predefiniti o combinando più colonne in una, COALESCE() aiuta a mantenere la logica pulita e leggibile.
Pronto a migliorare le tue competenze SQL? Dai un’occhiata a questi corsi accessibili ai principianti e utili per la carriera su DataCamp:
FAQs
Cosa succede se tutti i valori in COALESCE() sono NULL?
Se ogni argomento passato alla funzione COALESCE() è NULL, la funzione restituirà NULL.
In cosa COALESCE() è diversa da ISNULL() o IFNULL()?
ISNULL()(SQL Server) eIFNULL()(MySQL, SQLite) accettano solo due argomenti.-
COALESCE()può accettare più argomenti ed è più standard tra i diversi dialetti SQL. -
COALESCE()fa parte dello standard ANSI SQL, mentreISNULL()eIFNULL()sono specifiche del database.
Posso usare COALESCE() con espressioni o funzioni?
Sì, puoi usare nomi di colonne, letterali, funzioni o espressioni all’interno di COALESCE().
COALESCE(LOWER(name), 'unknown')Ci sono costi prestazionali nell’uso di COALESCE()?
In generale, no—COALESCE() è efficiente. Tuttavia, se la usi con espressioni complesse o all’interno di query di grandi dimensioni, il database potrebbe valutare più espressioni del necessario, a seconda di come è scritta.
COALESCE() funziona con tipi di dati diversi?
Sì, ma tutti gli argomenti devono essere convertibili implicitamente a un tipo di dato comune. Altrimenti, potrebbe restituire un errore di conversione del tipo a seconda del tuo motore SQL.
Posso annidare funzioni COALESCE()?
Sì, puoi annidarle, anche se è raramente necessario dato che COALESCE() gestisce già più argomenti:
COALESCE(col1, COALESCE(col2, 'default'))
Questo è equivalente a:
COALESCE(col1, col2, 'default')

