Parliamo di un'altra funzione per lavorare con il misterioso NULL — NULLIF(). Ti aiuterà quando hai bisogno di sostituire certi valori con NULL per gestire meglio i dati. Allaccia le cinture, sarà un viaggio interessante!
La funzione NULLIF() è uno strumento top in PostgreSQL che ti permette di confrontare due valori e restituire NULL se sono uguali, oppure il primo valore se sono diversi. È come se dicesse: "Se questi valori sono identici, dimentichiamocene!"
Ecco la sintassi base della funzione:
NULLIF(value1, value2)
Se value1 e value2 sono uguali, il risultato sarà NULL. Se sono diversi, il risultato sarà value1.
Esempio:
SELECT NULLIF(10, 10); -- Risultato: NULL
SELECT NULLIF(10, 20); -- Risultato: 10
SELECT NULLIF('hello', 'hello'); -- Risultato: NULL
SELECT NULLIF('hello', 'world'); -- Risultato: 'hello'
Semplice, vero? Ora proviamo a usare questa funzione in situazioni reali.
Esempio 1: Evitare la divisione per zero
La divisione per zero è l'incubo di ogni programmatore. In SQL, se provi a dividere per zero, ottieni un errore. Qui entra in gioco NULLIF().
Immagina: abbiamo una tabella sales con due colonne: revenue (entrate) e expenses (spese). Vogliamo calcolare la redditività delle spese (revenue / expenses), ma a volte le spese sono zero. Se facciamo la query senza controlli, avremo un errore di divisione per zero.
Tabella sales:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
Query sbagliata:
SELECT revenue / expenses AS profitability
FROM sales;
-- Errore: divisione per zero!
Soluzione con NULLIF():
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
Risultato:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
Ora, se expenses è 0, NULLIF(expenses, 0) restituisce NULL e la divisione per NULL non dà errore, ma semplicemente restituisce NULL.
Esempio 2: Sostituire valori uguali con NULL
Immagina di avere una tabella con dati sugli studenti, con le colonne first_name e preferred_name. A volte gli studenti preferiscono il loro vero nome, a volte scelgono altro. Se i due nomi sono uguali, non ha senso mostrare preferred_name.
Tabella students:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
Query con NULLIF():
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
Risultato:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
Quando preferred_name e first_name sono uguali, il risultato è NULL.
Esempio 3: Filtrare i dati
A volte vuoi selezionare solo le righe dove i valori di due colonne sono diversi. Per esempio, abbiamo una tabella ordini con original_price e discounted_price. Vogliamo trovare gli ordini dove è stato applicato uno sconto.
Tabella orders:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
Query con NULLIF():
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
Risultato:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
Solo gli ordini con sconto sono nel risultato.
Casi pratici d'uso di NULLIF()
Caso 1: Scegliere un valore opzionale
Lavorando con i dati, a volte vuoi scegliere un valore da più colonne, escludendo quelli uguali a un certo valore. Per esempio, abbiamo una lista di dipendenti con i loro stipendi: base_salary e bonus. Se il bonus è 0, vogliamo impostarlo a 999.
Tabella employees:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
Query con NULLIF():
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
Risultato:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
Se bonus è 0, viene trasformato in 999.
Caso 2: Contare le righe
Possiamo usare NULLIF() per semplificare condizioni di filtro complesse. Per esempio, abbiamo una tabella utenti e vogliamo sapere in una sola query sia il numero totale che il numero di utenti registrati (escludendo quelli con status guest).
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
Così, con una sola funzione NULLIF() puoi risolvere un sacco di problemi: da evitare errori a rendere il codice più leggibile. Ora che sai come funziona, sei già un passo più vicino a diventare un pro nella gestione dei dati in PostgreSQL.
GO TO FULL VERSION