Oggi ci addentriamo di nuovo nel tema della gestione di NULL e conosciamo una funzione davvero utile — COALESCE(). Questa funzione ti permette di gestire in modo elegante i valori NULL nei tuoi dati.
Vediamo un esempio: hai una tabella con i dati dei dipendenti, ma per alcuni manca l'informazione sullo stipendio. Cosa succede se proviamo ad aumentare tutti gli stipendi? Niente di buono. Non puoi fare operazioni con NULL. E se invece volessimo sostituire gli stipendi NULL con, diciamo, 0? Qui entra in gioco COALESCE().
COALESCE() — è una funzione che restituisce il primo valore non-NULL dalla lista di argomenti che gli passi. Se tutti i valori nella lista sono NULL, la funzione restituisce NULL. In parole povere, è come dire: "Dammi il primo valore decente che riesci a trovare, per favore!"
Sintassi
COALESCE(value1, value2, ..., value_n)
value1, value2, ..., value_n — sono gli argomenti che passi alla funzione. Lei ti restituisce il primo valore che non è NULL.
Esempi di utilizzo di COALESCE()
Vediamo un paio di esempi.
Esempio 1: Sostituire NULL con 0
Supponiamo di avere una tabella salaries:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | NULL |
| 3 | Alex | 60000 |
| 4 | Anna | NULL |
Vogliamo calcolare la somma totale degli stipendi - è facile:
SELECT SUM(salary) AS total_salary
FROM salaries;
La funzione SUM() ignora i NULL, quindi nessun problema.
Ma poi vogliamo calcolare la somma totale degli stipendi, se diamo a ogni dipendente un bonus di 1000.
SELECT SUM(salary+1000) AS total_salary
FROM salaries;
E il risultato inizia a sballare. Meglio eliminare subito i valori NULL usando la funzione COALESCE e sostituirli con 0. Vediamo come si fa:
SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;
Risultato:
| total_salary |
|---|
| 110000 |
Così è meglio e più affidabile.
Esempio 2: Sostituire NULL con un valore di default
Supponiamo di avere una tabella students con nomi e indirizzi:
| id | name | address |
|---|---|---|
| 1 | Anna | Kanne |
| 2 | Peter | NULL |
| 3 | Lisa | Painful |
| 4 | Alex | NULL |
Vogliamo sostituire NULL negli indirizzi con "Non specificato":
SELECT name, COALESCE(address, 'Non specificato') AS resolved_address
FROM students;
Risultato della query:
| name | resolved_address |
|---|---|
| Anna | Kanne |
| Peter | Non specificato |
| Lisa | Painful |
| Alex | Non specificato |
Esempio 3: Usare più valori
A volte capita che NULL vada sostituito non con un solo valore, ma con una serie di valori. Per esempio, vogliamo scegliere il nome, il nome per gli amici o usare "Senza nome" se nessuno dei due è impostato. Tabella users:
| user_id | first_name | short_name | full_name |
|---|---|---|---|
| 1 | John | Jonny | Johnny Walker |
| 2 | NULL |
Pete | Peter Kamen |
| 3 | NULL |
NULL |
Query:
SELECT user_id,
COALESCE(first_name, short_name, 'Senza nome') AS display_name
FROM users;
Risultato:
| user_id | display_name |
|---|---|
| 1 | John |
| 2 | Pete |
| 3 | Senza nome |
Applicazione pratica di COALESCE()
Nella pratica COALESCE() — è un vero salvagente quando lavori con dati non perfetti.
Vediamo come aiuta in diversi casi.
Esempio 1: Sostituzione di valori nei campi di testo
Tabella di partenza customers:
| id | name | address |
|---|---|---|
| 1 | Alex Lin | 123 Maple St |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 456 Oak Ave |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 789 Pine Rd |
Query:
SELECT name, COALESCE(address, 'Non specificato') AS address
FROM customers;
Risultato:
| name | address |
|---|---|
| Alex Lin | 123 Maple St |
| Maria Chi | Non specificato |
| Anna Song | 456 Oak Ave |
| Otto Art | Non specificato |
| Liam Park | 789 Pine Rd |
Esempio 2: Preparazione dei dati per i report
Tabella di partenza sales:
| id | product | price |
|---|---|---|
| 1 | Widget A | 100 |
| 2 | Widget B | NULL |
| 3 | Widget C | 250 |
| 4 | Widget D | NULL |
| 5 | Widget E | 300 |
Query:
SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;
Risultato:
| total_sales |
|---|
| 650 |
Errori tipici nell'uso di COALESCE()
Anche se COALESCE() sembra una funzione semplice e universale, ci sono alcuni trabocchetti in cui puoi incappare.
Incompatibilità dei tipi di dato. Tutti gli argomenti che passi a COALESCE() devono essere compatibili come tipo di dato. Ad esempio, non puoi mischiare valori stringa e numerici.
-- Errore
SELECT COALESCE(salary, 'Non specificato') FROM employees;
-- salary — campo numerico, e 'Non specificato' — testo.
Ignorare l'ordine degli argomenti. COALESCE() restituisce il primo valore non-NULL, quindi l'ordine degli argomenti è fondamentale.
GO TO FULL VERSION