In MySQL, a volte non vuoi che i valori NULL vengano restituiti come NULL
. A volte si desidera che i valori NULL vengano restituiti con un valore diverso, ad esempio "N/D", "Non applicabile", "Nessuno" o anche la stringa vuota "".
Fortunatamente ci sono diversi modi per farlo in MySQL.
Eccone quattro:
- Il
IFNULL()
funzione - Il
COALESCE()
funzione - Il
IF()
funzione combinata conIS NULL
(oIS NOT NULL
) operatore - Il
CASE
espressione combinata conIS NULL
(oIS NOT NULL
) operatore
Di seguito sono riportati esempi di queste opzioni.
Dati di esempio
Per prima cosa, prendiamo alcuni dati di esempio:
USE Solutions; SELECT TaskCode From Tasks;
Risultato:
+----------+ | TaskCode | +----------+ | gar123 | | NULL | | NULL | | dog456 | | NULL | | cat789 | +----------+
Quindi abbiamo tre valori NULL e tre valori non NULL.
La funzione IFNULL()
Dato il suo nome, questa è probabilmente l'opzione più ovvia per sostituire i valori NULL in MySQL. Questa funzione è sostanzialmente l'equivalente di ISNULL()
in SQL Server.
Il IFNULL()
La funzione consente di fornire due argomenti. Il primo argomento viene restituito solo se non è NULL. Se è NULL, viene invece restituito il secondo argomento.
Ecco un esempio di utilizzo di IFNULL()
rispetto al nostro set di dati di esempio:
SELECT IFNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Risultato:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Qui, abbiamo semplicemente sostituito i valori NULL con N/A
.
La funzione COALESCE()
Questa funzione è simile a IFNULL()
funzione, ma leggermente diversa. Questa funzione aderisce allo standard ANSI SQL ed è ampiamente distribuita in vari RDBMS .
Il modo in cui funziona è che fornisci tutti gli argomenti di cui hai bisogno. COALESCE()
restituirà quindi il primo non NULL
valore nell'elenco o NULL
se non sono presenti NULL
valori.
In questo modo:
SELECT COALESCE(TaskCode, 'N/A') AS Result FROM Tasks;
Risultato:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Quindi otteniamo esattamente lo stesso risultato di prima.
Tuttavia, la differenza con questa funzione è che, come accennato, puoi fornire un elenco di argomenti. Il COALESCE()
la funzione prenderà qualunque sia il primo valore non NULL.
Quindi, ad esempio, potremmo aggiungere NULL
come primo argomento e posizionare None
prima di N/A
e guarda cosa succede:
SELECT COALESCE(NULL, TaskCode, 'None', 'N/A') AS Result FROM Tasks;
Risultato:
+--------+ | Result | +--------+ | gar123 | | None | | None | | dog456 | | None | | cat789 | +--------+
Ha saltato il primo NULL
come previsto, ha saltato tutti i valori NULL nel TaskCode
colonna, prima di scegliere None
. Il N/A
value non è stato utilizzato in questo caso perché None
è arrivato per primo ed è un valore non NULL.
La funzione IF() combinata con IS NULL/IS NOT NULL
Il IS NULL
e IS NOT NULL
gli operatori consentono di verificare i valori NULL e di presentare un valore diverso a seconda del risultato.
Possiamo usare questi operatori all'interno di IF()
funzione, in modo che vengano restituiti valori non NULL e i valori NULL vengano sostituiti con un valore a nostra scelta.
Esempio:
SELECT IF(TaskCode IS NOT NULL, TaskCode, 'N/A') AS Result FROM Tasks;
Risultato:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Quindi lo stesso risultato di IFNULL()
e COALESCE()
funzioni.
E, naturalmente, potremmo scambiare IS NOT NULL
con IS NULL
. Se lo facciamo, dovremmo scambiare anche gli argomenti successivi:
SELECT IF(TaskCode IS NULL, 'N/A', TaskCode) AS Result FROM Tasks;
L'espressione CASE combinata con IS NULL/IS NOT NULL
Un altro modo per farlo è utilizzare il CASE
espressione:
SELECT CASE WHEN TaskCode IS NOT NULL THEN TaskCode ELSE 'N/A' END AS Result FROM Tasks;
Risultato:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Come con l'esempio precedente, questo potrebbe essere riscritto per usare IS NULL
invece di IS NOT NULL
:
SELECT CASE WHEN TaskCode IS NULL THEN 'N/A' ELSE TaskCode END AS Result FROM Tasks;