In MySQL wilt u soms niet dat NULL-waarden worden geretourneerd als NULL
. Soms wilt u dat NULL-waarden worden geretourneerd met een andere waarde, zoals "N.v.t.", "Niet van toepassing", "Geen", of zelfs de lege tekenreeks "".
Gelukkig zijn er verschillende manieren om dit in MySQL te doen.
Hier zijn er vier:
- De
IFNULL()
functie - De
COALESCE()
functie - De
IF()
functie gecombineerd met deIS NULL
(ofIS NOT NULL
) operator - De
CASE
uitdrukking gecombineerd met deIS NULL
(ofIS NOT NULL
) operator
Voorbeelden van deze opties staan hieronder.
Voorbeeldgegevens
Laten we eerst wat voorbeeldgegevens pakken:
USE Solutions; SELECT TaskCode From Tasks;
Resultaat:
+----------+ | TaskCode | +----------+ | gar123 | | NULL | | NULL | | dog456 | | NULL | | cat789 | +----------+
We hebben dus drie NULL-waarden en drie niet-NULL-waarden.
De IFNULL()-functie
Gezien de naam is dit waarschijnlijk de meest voor de hand liggende optie om NULL-waarden in MySQL te vervangen. Deze functie is in feite het equivalent van ISNULL()
in SQL Server.
De IFNULL()
functie kunt u twee argumenten opgeven. Het eerste argument wordt alleen geretourneerd als het niet NULL is. Als het NULL is, wordt in plaats daarvan het tweede argument geretourneerd.
Hier is een voorbeeld van het gebruik van IFNULL()
vergeleken met onze voorbeeldgegevensset:
SELECT IFNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Resultaat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Hier hebben we eenvoudigweg NULL-waarden vervangen door N/A
.
De COALESCE()-functie
Deze functie is vergelijkbaar met de IFNULL()
functie, maar iets anders. Deze functie voldoet aan de ANSI SQL -standaard en wordt op grote schaal ingezet in verschillende RDBMS'en.
De manier waarop het werkt, is dat je zoveel argumenten geeft als je nodig hebt. COALESCE()
retourneert dan de eerste niet-NULL
waarde in de lijst, of NULL
als er geen niet-NULL
. zijn waarden.
Zoals dit:
SELECT COALESCE(TaskCode, 'N/A') AS Result FROM Tasks;
Resultaat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
We krijgen dus precies hetzelfde resultaat als voorheen.
Het verschil met deze functie is echter dat je, zoals gezegd, een lijst met argumenten kunt geven. De COALESCE()
functie zal de eerste niet-NULL-waarde aannemen.
We kunnen bijvoorbeeld NULL
. toevoegen als het eerste argument en plaats None
voor N/A
en kijk wat er gebeurt:
SELECT COALESCE(NULL, TaskCode, 'None', 'N/A') AS Result FROM Tasks;
Resultaat:
+--------+ | Result | +--------+ | gar123 | | None | | None | | dog456 | | None | | cat789 | +--------+
Het heeft de eerste NULL
overgeslagen zoals verwacht, sloeg het alle NULL-waarden over in de TaskCode
kolom, voordat u genoegen neemt met None
. De N/A
waarde is in dit geval niet gebruikt omdat None
kwam eerst en het is een waarde die niet NULL is.
De IF()-functie gecombineerd met IS NULL/IS NOT NULL
De IS NULL
en IS NOT NULL
Met operators kunt u testen op NULL-waarden en een andere waarde presenteren, afhankelijk van de uitkomst.
We kunnen deze operatoren gebruiken binnen de IF()
functie, zodat niet-NULL-waarden worden geretourneerd en NULL-waarden worden vervangen door een waarde naar keuze.
Voorbeeld:
SELECT IF(TaskCode IS NOT NULL, TaskCode, 'N/A') AS Result FROM Tasks;
Resultaat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Dus hetzelfde resultaat als met de IFNULL()
en COALESCE()
functies.
En natuurlijk kunnen we IS NOT NULL
swap omwisselen met IS NULL
. Als we dat doen, moeten we ook de volgende argumenten omwisselen:
SELECT IF(TaskCode IS NULL, 'N/A', TaskCode) AS Result FROM Tasks;
De CASE-expressie gecombineerd met IS NULL/IS NOT NULL
Een andere manier om dit te doen is door de CASE
. te gebruiken uitdrukking:
SELECT CASE WHEN TaskCode IS NOT NULL THEN TaskCode ELSE 'N/A' END AS Result FROM Tasks;
Resultaat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Net als bij het vorige voorbeeld, kan dit worden herschreven om IS NULL
te gebruiken in plaats van IS NOT NULL
:
SELECT CASE WHEN TaskCode IS NULL THEN 'N/A' ELSE TaskCode END AS Result FROM Tasks;