I MySQL ønsker du nogle gange ikke, at NULL-værdier skal returneres som NULL
. Nogle gange ønsker du, at NULL-værdier skal returneres med en anden værdi, såsom "N/A", "Ikke relevant", "Ingen" eller endda den tomme streng "".
Heldigvis er der flere måder at gøre dette på i MySQL.
Her er fire:
IFNULL()
funktionCOALESCE()
funktionIF()
funktion kombineret medIS NULL
(ellerIS NOT NULL
) operatørCASE
udtryk kombineret medIS NULL
(ellerIS NOT NULL
) operatør
Eksempler på disse muligheder er nedenfor.
Eksempel på data
Lad os først tage nogle eksempeldata:
USE Solutions; SELECT TaskCode From Tasks;
Resultat:
+----------+ | TaskCode | +----------+ | gar123 | | NULL | | NULL | | dog456 | | NULL | | cat789 | +----------+
Så vi har tre NULL-værdier og tre ikke-NULL-værdier.
IFNULL()-funktionen
I betragtning af dets navn er dette sandsynligvis den mest oplagte mulighed for at erstatte NULL-værdier i MySQL. Denne funktion svarer grundlæggende til ISNULL()
i SQL Server.
IFNULL()
funktionen giver dig mulighed for at angive to argumenter. Det første argument returneres kun, hvis det ikke er NULL. Hvis det er NULL, returneres det andet argument i stedet.
Her er et eksempel på brug af IFNULL()
mod vores eksempeldatasæt:
SELECT IFNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Resultat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Her erstattede vi simpelthen NULL-værdier med N/A
.
COALESCE()-funktionen
Denne funktion ligner IFNULL()
funktion, men lidt anderledes. Denne funktion overholder ANSI SQL-standarden, og den er udbredt på tværs af forskellige RDBMS'er.
Den måde, det fungerer på, er, at du giver så mange argumenter, som du har brug for. COALESCE()
vil derefter returnere den første ikke-NULL
værdi på listen, eller NULL
hvis der ikke er nogen ikke-NULL
værdier.
Sådan:
SELECT COALESCE(TaskCode, 'N/A') AS Result FROM Tasks;
Resultat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Så vi får præcis det samme resultat som tidligere.
Forskellen med denne funktion er dog, at du som nævnt kan give en liste med argumenter. COALESCE()
funktion vil tage den første værdi, der ikke er NULL.
Så for eksempel kunne vi tilføje NULL
som det første argument og placer None
før N/A
og se, hvad der sker:
SELECT COALESCE(NULL, TaskCode, 'None', 'N/A') AS Result FROM Tasks;
Resultat:
+--------+ | Result | +--------+ | gar123 | | None | | None | | dog456 | | None | | cat789 | +--------+
Den sprang den første NULL
over som forventet, sprang den alle NULL-værdier over i TaskCode
kolonne, før du vælger None
. N/A
værdi blev ikke brugt i dette tilfælde, fordi None
kom først, og det er en ikke-NULL-værdi.
HVIS()-funktionen kombineret med ER NULL/ER IKKE NULL
IS NULL
og IS NOT NULL
operatorer giver dig mulighed for at teste for NULL-værdier og præsentere en anden værdi afhængigt af resultatet.
Vi kan bruge disse operatorer i IF()
funktion, så ikke-NULL-værdier returneres, og NULL-værdier erstattes med en værdi efter eget valg.
Eksempel:
SELECT IF(TaskCode IS NOT NULL, TaskCode, 'N/A') AS Result FROM Tasks;
Resultat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Så det samme resultat som med IFNULL()
og COALESCE()
funktioner.
Og selvfølgelig kunne vi bytte IS NOT NULL
med IS NULL
. Hvis vi gør det, skal vi også bytte de efterfølgende argumenter:
SELECT IF(TaskCode IS NULL, 'N/A', TaskCode) AS Result FROM Tasks;
CASE-udtrykket kombineret med ER NULL/ER IKKE NULL
En anden måde at gøre det på er at bruge CASE
udtryk:
SELECT CASE WHEN TaskCode IS NOT NULL THEN TaskCode ELSE 'N/A' END AS Result FROM Tasks;
Resultat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Som med det foregående eksempel kunne dette omskrives til at bruge IS NULL
i stedet for IS NOT NULL
:
SELECT CASE WHEN TaskCode IS NULL THEN 'N/A' ELSE TaskCode END AS Result FROM Tasks;