Lavorare con NULL capita in tantissimi scenari: dalla gestione dei dati mancanti nei report al filtraggio e ordinamento. Se dovessi scegliere tra l’assenza di un valore in tabella e un numero strano tipo 9999, la maggior parte sceglierebbe NULL — sì, sono d’accordo che non è il massimo della comodità, ma almeno è onesto. Vediamo qualche caso tipico.
Esempio: ordinamento dei prodotti con prezzi mancanti
Immagina di gestire un e-commerce e di avere una tabella dei prodotti:
| product_id | name | price |
|---|---|---|
| 1 | Telefono | 45000 |
| 2 | Notebook | NULL |
| 3 | Camera | 25000 |
| 4 | Smartwatch | NULL |
Vogliamo ordinare i prodotti per prezzo, mettendo quelli senza prezzo (NULL) alla fine.
SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;
Risultato:
| product_id | name | price |
|---|---|---|
| 3 | Camera | 25000 |
| 1 | Telefono | 45000 |
| 2 | Notebook | NULL |
| 4 | Smartwatch | NULL |
Occhio alla clausola chiave NULLS LAST. Di default PostgreSQL per ASC mette i valori NULL all’inizio, ma con questo parametro li spostiamo in fondo.
Esempio: filtrare studenti senza data di nascita
Abbiamo una tabella degli studenti e vogliamo selezionare solo quelli che non hanno la data di nascita indicata.
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Query:
SELECT student_id, name
FROM students
WHERE birth_date IS NULL;
Risultato:
| student_id | name |
|---|---|
| 2 | Anna Song |
| 4 | Maria Chi |
Siamo riusciti a tirare fuori le info sugli studenti di cui non si conosce la data di nascita.
Esempi di uso di funzioni per gestire NULL
Esempio: calcolo del totale considerando possibili NULL
Nella tabella degli ordini sono salvati gli importi degli ordini. Però i dati non sono sempre completi, quindi dobbiamo considerare che in questi casi l’importo può essere 0.
Esempio dati:
| order_id | customer_name | order_amount |
|---|---|---|
| 1 | Alex | 1200 |
| 2 | Maria | 2500 |
| 3 | Max | NULL |
| 4 | Xena | 3100 |
Query:
SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;
Risultato:
| total_amount |
|---|
| 6800 |
Usiamo COALESCE(order_amount, 0) per sostituire NULL con 0 prima di sommare. Così evitiamo errori o conteggi sballati.
Esempio: mostrare testo al posto di NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Nel report dobbiamo mostrare il testo "Non specificato" per tutti i dati vuoti invece di NULL.
SELECT
customer_name,
COALESCE(order_amount::TEXT, 'Non specificato') AS order_status
FROM orders;
Risultato:
| customer_name | order_status |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | Non specificato |
| Xena | 3100 |
COALESCE() ti permette di mostrare il testo che vuoi se il valore è NULL.
Scenari complessi con NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Il nostro obiettivo è ordinare gli ordini in modo che quelli con importo mancante siano all’inizio, poi dal più grande al più piccolo.
SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;
Risultato:
| customer_name | order_amount |
|---|---|
| Max | NULL |
| Xena | 3100 |
| Maria | 2500 |
| Alex | 1200 |
Qui abbiamo usato NULLS FIRST per mettere i valori NULL prima di tutti gli altri.
Esempio: filtrare dati sostituendo i valori NULL
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
In alcuni report bisogna mostrare solo le righe dove il valore è presente o sostituirlo con "Sconosciuto" se è NULL.
SELECT
student_id,
name,
COALESCE(birth_date::TEXT, 'Sconosciuto') AS birth_date_info
FROM students;
Risultato:
| student_id | name | birth_date_info |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | Sconosciuto |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | Sconosciuto |
Questo è particolarmente utile quando fai report e vuoi mostrare che i dati non ci sono.
Consigli pratici
Lavorare con NULL richiede attenzione. Ecco qualche dritta utile:
- Usa
IS NULLeCOALESCE()per controllare e sostituire i valori mancanti. - Ricorda che le funzioni di aggregazione ignorano
NULL, tranneCOUNT(*). - Per ordinare, ricordati delle parole chiave
NULLS FIRSTeNULLS LAST. - Nei report, specifica sempre come gestisci i
NULL, così eviti malintesi con i colleghi.
Queste cose ti aiuteranno non solo a scrivere query giuste, ma anche a fare bella figura a un colloquio. Saper lavorare con dati veri vale sempre più della sola teoria!
GO TO FULL VERSION