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
CASEespressione 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;