CodeGym /Corsi /SQL SELF /Gestione di NULL nei calcoli con COALESCE()

Gestione di NULL nei calcoli con COALESCE()

SQL SELF
Livello 9 , Lezione 3
Disponibile

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.

2
Compito
SQL SELF, livello 9, lezione 3
Bloccato
Sostituzione dei valori NULL con un valore di default
Sostituzione dei valori NULL con un valore di default
2
Compito
SQL SELF, livello 9, lezione 3
Bloccato
Sostituzione dei valori NULL con diversi livelli di priorità
Sostituzione dei valori NULL con diversi livelli di priorità
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION