Guida alla funzione IFNULL di MySQL: Sostituire i valori NULL (alternativa a Oracle NVL)

目次

1. Introduzione

Quando si lavora con i database, la gestione dei valori NULL è un punto critico.
In particolare, non è raro che le persone abituate alla funzione NVL di Oracle si rendano conto che NVL non è disponibile durante la migrazione a MySQL.

In MySQL, è possibile gestire correttamente i valori NULL utilizzando la funzione IFNULL al posto di NVL.
Questo articolo spiega come lavorare con i valori NULL in MySQL in dettaglio, coprendo come utilizzare IFNULL e come si differenzia da altre funzioni di gestione dei NULL.

1.1 Cos’è un valore NULL?

Nei database, NULL significa “nessun valore è stato impostato.”
Poiché questo è diverso da “0” o da una “stringa vuota”, non gestirlo correttamente può portare a errori imprevisti o risultati di query errati.

Ad esempio, supponi di avere dati come i seguenti.

IDNameAge
1Yamada25
2SatoNULL
3Suzuki30

Nei dati sopra, l’età per l’ID “2” (Sato) è NULL.
Se esegui calcoli così come sono, potresti ottenere errori o risultati non intenzionali.

1.2 Come MySQL gestisce i valori NULL

2. Cos’è la funzione IFNULL?

MySQL fornisce la funzione IFNULL come funzione per sostituire i valori NULL con un altro valore.
Svolge un ruolo simile alla funzione NVL di Oracle.

Gestendo appropriatamente i valori NULL, è possibile prevenire problemi di calcolo causati da dati mancanti e creare query SQL più stabili.
Esaminiamo più da vicino l’uso base di IFNULL.

2.1 Sintassi base di IFNULL

La sintassi base della funzione IFNULL è la seguente.

IFNULL(expression, fallback_value)
  • expression : La colonna o il valore da controllare per NULL
  • fallback_value : Il valore da restituire quando l’espressione è NULL (se non è NULL, l’espressione viene restituita così com’è)

Ad esempio, considera l’istruzione SQL seguente.

SELECT IFNULL(NULL, 'Fallback value');

In questo caso, poiché è specificato NULL, il risultato diventa 'Fallback value'.

Result
Fallback value

D’altra parte, se specifichi un valore non NULL, quel valore viene restituito così com’è.

SELECT IFNULL('Hello', 'Fallback value');
Result
Hello

2.2 Caratteristiche principali di IFNULL

La funzione IFNULL ha le seguenti caratteristiche.

  1. Può convertire i valori NULL in un valore specifico
  • È possibile impostare un valore predefinito alternativo per le colonne che potrebbero contenere NULL.
  1. Utilizza una sintassi semplice
  • È più semplice da scrivere rispetto all’uso di un’espressione CASE.
  1. Bisogna considerare i tipi di dati
  • È raccomandato che gli argomenti di IFNULL siano dello stesso tipo di dati .

Ad esempio, l’SQL seguente può causare un errore.

SELECT IFNULL(100, 'Error');

Motivo: Un tipo numerico (100) e un tipo stringa (‘Error’) sono mescolati.
In questo caso, il valore di fallback dovrebbe essere anch’esso numerico.

SELECT IFNULL(100, 0);

2.3 Quando utilizzare IFNULL

Ecco alcune situazioni pratiche in cui IFNULL è utile.

  1. Impostare un valore predefinito per NULL
  • Ad esempio, se il bonus di un dipendente è NULL, impostalo a 0.
    SELECT name, IFNULL(bonus, 0) AS bonus
    FROM employees;
    
  1. Evitare calcoli che coinvolgono NULL
  • Se calcoli con NULL così com’è, il risultato diventa anch’esso NULL.
  • Utilizzando IFNULL per evitare NULL, è possibile eseguire il calcolo previsto.
    SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income
    FROM employees;
    
  1. Gestire correttamente NULL in report e aggregazioni
  • Se è presente NULL durante l’analisi, potrebbero essere prodotti report errati.
  • Sostituendo NULL con un valore specifico utilizzando IFNULL, è possibile elaborare i dati in modo coerente.

3. Esempi pratici della funzione IFNULL

Nella sezione precedente, abbiamo spiegato le basi della funzione IFNULL.
In questa sezione, introdurremo esempi concreti di utilizzo con dati reali.

3.1 Sostituire i valori NULL con un valore predefinito

Se una tabella contiene valori NULL, potrebbe causare comportamenti non intenzionali.
Per risolvere questo, è possibile utilizzare IFNULL per sostituire NULL con un valore predefinito.

Esempio: se il bonus di un dipendente è NULL, impostare il valore predefinito a 0

SELECT name, IFNULL(bonus, 0) AS bonus
FROM employees;

Dati prima dell’esecuzione

namebonus
Sato5000
SuzukiNULL
Takahashi8000

Dopo aver applicato IFNULL

namebonus
Sato5000
Suzuki0
Takahashi8000

Sostituire NULL con 0 rende l’aggregazione e l’elaborazione correlata più fluida.

3.2 Evita calcoli che includono NULL

In MySQL, il risultato di un calcolo che include NULL diventa NULL.
Pertanto, è necessario utilizzare IFNULL per evitare NULL.

Esempio: Calcola il totale di stipendio e bonus

SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income
FROM employees;

Dati prima dell’esecuzione

namesalarybonus
Sato3000005000
Suzuki280000NULL
Takahashi3200008000

Dopo aver applicato IFNULL

namesalarybonustotal_income
Sato3000005000305000
Suzuki2800000280000
Takahashi3200008000328000

Se il bonus è NULL, il totale (salary + bonus) diventa anch’esso NULL, ma applicando IFNULL, MySQL tratta NULL come 0 e calcola correttamente.

3.3 Sostituisci NULL con un’altra stringa

Puoi impostare una stringa predefinita non solo per i numeri, ma anche quando il valore è NULL.

Esempio: Mostra “Non registrato” per gli utenti senza indirizzo email

SELECT id, name, IFNULL(email, 'Not registered') AS email
FROM users;

Dati prima dell’esecuzione

idnameemail
1Satosatou@example.com
2SuzukiNULL
3Takahashitakahashi@example.com

Dopo aver applicato IFNULL

idnameemail
1Satosatou@example.com
2SuzukiNot registered
3Takahashitakahashi@example.com

Se lasciato come NULL, il campo appare vuoto, ma IFNULL lo rende esplicito con “Non registrato”.

3.4 Usa IFNULL in una clausola WHERE

Puoi usare IFNULL in una clausola WHERE per filtrare in base a condizioni che includono valori NULL.

Esempio: Recupera solo gli utenti con valori NULL

SELECT *
FROM users
WHERE IFNULL(email, '') = '';

Questo SQL tratta email come '' (una stringa vuota) quando è NULL, e recupera solo gli utenti la cui email è NULL.

3.5 Metti i valori NULL alla fine in ORDER BY

Normalmente, quando usi ORDER BY, i valori NULL possono apparire per primi, ma puoi usare IFNULL per spostarli alla fine.

Esempio: Posiziona le righe con valori NULL alla fine

SELECT name, salary
FROM employees
ORDER BY IFNULL(salary, 0) ASC;

4. Differenze tra IFNULL e COALESCE

MySQL fornisce più funzioni per gestire i valori NULL, e IFNULL e COALESCE sono spesso confrontati.
Entrambe sostituiscono i valori NULL con alternative, ma il loro utilizzo e comportamento differiscono.

In questa sezione, spieghiamo le differenze tra IFNULL e COALESCE e come scegliere quella giusta.

4.1 Cos’è la funzione COALESCE?

La funzione COALESCE restituisce il primo valore non-NULL tra più argomenti.
In altre parole, mentre IFNULL seleziona il valore non-NULL tra due valori, COALESCE differisce selezionando il primo valore non-NULL tra più candidati.

Sintassi

COALESCE(expr1, expr2, ... , exprN)
  • Valuta da sinistra a destra e restituisce il primo valore non-NULL
  • Restituisce NULL se tutti gli argomenti sono NULL

Esempio: Sostituire NULL usando COALESCE

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

In questo caso, i valori sono determinati come segue.

  1. Se phone non è NULL, restituisce phone.
  2. Se phone è NULL e email non è NULL, restituisce email.
  3. Se sia phone sia email sono NULL, restituisce 'Not registered'.

4.2 Differenze tra IFNULL e COALESCE

Comparison itemIFNULLCOALESCE
NULL handlingReturns the fallback value if one expression is NULLEvaluates multiple expressions and returns the first non-NULL value
Number of argumentsOnly 22 or more (multiple allowed)
Use caseSimple NULL replacementNULL handling with priority order
Execution speedFast (compares only 2 values)Slightly slower (evaluates multiple values in order)

4.3 Esempi pratici di IFNULL e COALESCE

Esempio 1: Sostituzione semplice di NULL

Con IFNULL, puoi selezionare il valore non-NULL tra due valori.

SELECT name, IFNULL(phone, 'Not registered') AS contact_info
FROM customers;

Risultato

namephonecontact_info
Sato080-1234-5678080-1234-5678
SuzukiNULLNot registered

Esempio 2: Preferisci il primo valore non-NULL disponibile

Con COALESCE, puoi recuperare il primo valore non-NULL.

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

Risultato

namephoneemailcontact_info
Sato080-1234-5678satou@example.com080-1234-5678
SuzukiNULLsuzuki@example.comsuzuki@example.com
TakahashiNULLNULLNot registered
  • Se phone non è NULL, restituisci phone
  • Se phone è NULL e email non è NULL, restituisci email
  • Se sia phone che email sono NULL, restituisci 'Not registered'

4.4 Come scegliere tra IFNULL e COALESCE

✔ Quando dovresti usare IFNULL

Quando vuoi una semplice sostituzione di NULL con un valore predefinito
Quando due argomenti sono sufficienti (ad esempio, convertire NULL in 0)

✔ Quando dovresti usare COALESCE

Quando vuoi trovare il primo valore non-NULL (ad esempio, phone → email → “Not registered”)
Quando hai bisogno di valutare tre o più valori

4.5 Confronto delle prestazioni tra IFNULL e COALESCE

In generale, IFNULL è più veloce di COALESCE.
Ciò è dovuto al fatto che IFNULL valuta solo due valori, mentre COALESCE valuta più valori in ordine.

Test delle prestazioni

Applicando IFNULL e COALESCE a 1 milione di righe, potresti vedere risultati simili a quanto segue.

FunctionExecution time (seconds)
IFNULL0.02
COALESCE0.05

Con grandi volumi di dati, IFNULL può essere leggermente più veloce.
➡ Tuttavia, se hai bisogno di un solo valore di fallback, usa IFNULL; se vuoi più candidati, usa COALESCE.

5. Funzioni di gestione dei NULL in database diversi da MySQL

MySQL fornisce la funzione IFNULL per gestire i valori NULL, ma altri sistemi di gestione di database (DBMS) utilizzano funzioni diverse.
Nei principali database come Oracle, PostgreSQL e SQL Server, è comune usare funzioni differenti da MySQL per la gestione dei NULL.

Questa sezione spiega come i valori NULL vengono gestiti nei database diversi da MySQL.

5.1 Gestione dei NULL in Oracle: la funzione NVL

In Oracle, la funzione NVL è fornita come equivalente della IFNULL di MySQL.
La funzione NVL restituisce un altro valore quando il valore specificato è NULL.

Sintassi

NVL(expression, fallback_value)
  • expression : La colonna o il valore da verificare per NULL
  • fallback_value : Il valore da restituire quando è NULL (se non è NULL, l’espressione viene restituita così com’è)

Esempio

SELECT name, NVL(salary, 0) AS salary
FROM employees;

Risultato

namesalary
Sato5000
Suzuki0
Takahashi8000

Il comportamento di NVL è quasi identico a quello della IFNULL di MySQL, quindi in Oracle puoi semplicemente usare NVL.

5.2 Gestione dei NULL in PostgreSQL e SQL Server: la funzione COALESCE

In PostgreSQL e SQL Server, la funzione COALESCE è usata per sostituire i valori NULL con alternative.
Questa funzione può restituire il primo valore non-NULL tra più candidati.

Sintassi

COALESCE(expr1, expr2, ..., exprN)
  • Valuta da sinistra a destra e restituisce il primo valore non-NULL
  • Restituisce NULL se tutti gli argomenti sono NULL

Esempio

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

Risultato

namephoneemailcontact_info
Sato080-1234-5678satou@example.com080-1234-5678
SuzukiNULLsuzuki@example.comsuzuki@example.com
TakahashiNULLNULLNot registered

Come mostrato sopra, in PostgreSQL e SQL Server, l’uso di COALESCE consente una gestione dei NULL più flessibile rispetto alla IFNULL di MySQL.

5.3 Confronto delle funzioni di gestione dei NULL tra i database

DatabaseNULL-handling functionRole
MySQLIFNULL(expression, fallback_value)Convert NULL to a fallback value
OracleNVL(expression, fallback_value)Convert NULL to a fallback value (equivalent to IFNULL)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)Return the first non-NULL value
  • Gestione semplice dei NULLIFNULL (MySQL) o NVL (Oracle)
  • Seleziona il valore migliore tra più candidatiCOALESCE (PostgreSQL, SQL Server)

5.4 Note durante la migrazione tra diversi DBMS

Durante la migrazione di sistemi tra diversi database, è necessario prestare attenzione alle differenze nelle funzioni di gestione dei NULL.
In particolare, quando si migra da Oracle a MySQL, è necessario riscrivere NVL in IFNULL.

Esempi di riscrittura durante la migrazione

  • Oracle (NVL)
    SELECT NVL(salary, 0) AS salary FROM employees;
    
  • MySQL (IFNULL)
    SELECT IFNULL(salary, 0) AS salary FROM employees;
    
  • PostgreSQL / SQL Server (COALESCE)
    SELECT COALESCE(salary, 0) AS salary FROM employees;
    

Also, because COALESCE can accept multiple arguments, it is more flexible than Oracle’s NVL or MySQL’s IFNULL.
During migration, it’s important to choose the correct function for the target database.

Durante la migrazione, è importante scegliere la funzione corretta per il database di destinazione.

6. Domande Frequenti (FAQ)

Le domande sulla funzione IFNULL di MySQL e sulla gestione di NULL sono importanti per sviluppatori e amministratori di database.
Questa sezione riassume le domande più comuni su IFNULL.

Q1. La funzione IFNULL e la funzione NVL sono la stessa cosa?

Offrono quasi la stessa funzionalità, ma il nome della funzione differisce a seconda del database.

DatabaseNULL-handling function
MySQLIFNULL(expression, fallback_value)
OracleNVL(expression, fallback_value)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)

In MySQL, usa IFNULL; in Oracle, usa NVL per convertire i valori NULL in un valore di fallback.

Q2. Qual è la differenza tra IFNULL e COALESCE?

IFNULL restituisce il valore non-NULL tra due argomenti, mentre
COALESCE restituisce il primo valore non-NULL tra più argomenti.

FunctionFeature
IFNULL(a, b)If a is NULL, return b (only two arguments)
COALESCE(a, b, c, ...)Evaluates left to right and returns the first non-NULL value

Esempi

SELECT IFNULL(NULL, 'Fallback value'); -- Result: 'Fallback value'
SELECT COALESCE(NULL, NULL, 'First non-NULL value'); -- Result: 'First non-NULL value'

✔ Quando dovresti usare IFNULL
✅ Restituire un valore predefinito specifico quando è NULL (ad esempio, se NULL allora 0)
✅ Quando confronti solo due valori

✔ Quando dovresti usare COALESCE
✅ Recuperare il primo valore non-NULL (ad esempio, telefono → email → valore predefinito)
✅ Quando è necessario valutare tre o più valori

Q3. IFNULL può essere usato con tipi di dati diversi dai numeri?

Sì. IFNULL può essere usato con stringhe, date, numeri e altro ancora.

Esempio 1: Uso di stringhe

SELECT name, IFNULL(email, 'Not registered') AS email
FROM users;

Esempio 2: Uso di date

SELECT name, IFNULL(last_login, '2000-01-01') AS last_login
FROM users;

Tuttavia, mescolare tipi di dati diversi (come numeri e stringhe) può causare errori, quindi fai attenzione.

SELECT IFNULL(100, 'Error'); -- May cause an error due to different data types

Q4. L’uso di IFNULL riduce le prestazioni?

In generale, l’impatto sulle prestazioni è minimo, ma può essere rilevante quando si elaborano grandi volumi di dati.

  • IFNULL è solitamente veloce perché controlla solo due valori
  • Tuttavia, un uso intensivo di IFNULL su dataset molto grandi (milioni di righe) può influenzare l’ottimizzazione degli indici in alcuni casi

🔹 Consigli per l’ottimizzazione delle prestazioni

  1. Imposta gli indici in modo appropriato
  • Query come IFNULL(colonna, 0) = 100 possono impedire l’uso degli indici in alcuni casi
  • Un approccio è memorizzare i valori con un valore predefinito appropriato invece di NULL fin dall’inizio
  1. IFNULL è più leggero di COALESCE
  • Poiché COALESCE valuta più valori in ordine, IFNULL può essere più veloce in molti casi

Q5. È possibile usare CASE al posto di IFNULL?

Sì. È possibile ottenere un comportamento simile con CASE, ma diventa più verboso.

Con IFNULL

SELECT name, IFNULL(salary, 0) AS salary
FROM employees;

Con CASE

SELECT name,
  CASE WHEN salary IS NULL THEN 0 ELSE salary END AS salary
FROM employees;

IFNULL è conciso e facile da usare
CASE supporta condizioni più flessibili (ad esempio, è possibile includere anche condizioni non-NULL)

Q6. IFNULL può essere usato in una clausola WHERE?

Sì. IFNULL può essere usato all’interno di una clausola WHERE.

Esempio: Sostituire NULL con un valore specifico durante la ricerca

SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';

Questo recupera i record in cui status è NULL.

Riepilogo

  • IFNULL e NVL hanno quasi la stessa funzionalità, ma differiscono a seconda del DBMS
  • IFNULL valuta 2 valori; COALESCE valuta più valori
  • Funziona con stringhe, date, numeri e altro
  • Per dataset di grandi dimensioni, considera l’ottimizzazione degli indici
  • Puoi usare CASE al posto di IFNULL
  • IFNULL può anche essere usato nelle clausole WHERE

7. Conclusione

In questo articolo, abbiamo trattato in dettaglio la funzione IFNULL di MySQL, inclusa la gestione dei valori NULL, le differenze rispetto ad altre funzioni e esempi pratici.
Infine, rivediamo brevemente quanto abbiamo coperto.

7.1 Cos’è la funzione IFNULL?

  • IFNULL restituisce un valore di fallback quando il valore specificato è NULL
  • Sintassi :
    IFNULL(expression, fallback_value)
    
  • Evitando i NULL, è possibile prevenire errori di calcolo e problemi di dati mancanti

7.2 Esempi pratici di IFNULL

  • Sostituire NULL con un valore predefinito (0 o una stringa specifica)
    SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
    
  • Gestire correttamente i calcoli che includono NULL
    SELECT name, salary + IFNULL(bonus, 0) AS total_income FROM employees;
    
  • Convertire NULL in una stringa appropriata, ad esempio “Non registrato”
    SELECT id, IFNULL(email, 'Not registered') AS email FROM users;
    
  • Utilizzare nelle clausole WHERE per filtrare i valori NULL
    SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';
    

7.3 Differenze tra IFNULL e COALESCE

  • IFNULL restituisce il valore non-NULL tra due argomenti
  • COALESCE restituisce il primo valore non-NULL tra più argomenti
  • Come scegliere
  • Gestione semplice dei NULL → IFNULL
  • Seleziona il primo valore non-NULL → COALESCE

7.4 Gestione dei NULL in altri DBMS

DatabaseNULL-handling function
MySQLIFNULL(expression, fallback_value)
OracleNVL(expression, fallback_value)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)
  • NVL di Oracle è quasi identico a IFNULL di MySQL
  • PostgreSQL e SQL Server usano comunemente COALESCE
  • Durante la migrazione, è necessario sostituire le funzioni in modo appropriato

7.5 Prestazioni e avvertenze per IFNULL

  • IFNULL è più leggero di COALESCE
  • Con grandi set di dati, le prestazioni possono degradarsi se l’ottimizzazione degli indici è influenzata
  • Fai attenzione a mantenere i tipi di dato coerenti (non mescolare tipi numerici e stringa)

7.6 Conclusioni finali

  • In MySQL, usa IFNULL per gestire correttamente i NULL
  • Puoi elaborare i dati senza essere influenzato dai NULL
  • Comprendi le differenze rispetto a COALESCE e NVL e utilizza la funzione corretta
  • Durante la migrazione tra database, presta attenzione alle differenze nelle funzioni di gestione dei NULL