I MySQL vill du ibland inte att NULL-värden ska returneras som NULL . Ibland vill du att NULL-värden ska returneras med ett annat värde, som "N/A", "Inte tillämpligt", "Ingen" eller till och med den tomma strängen "".
Lyckligtvis finns det flera sätt att göra detta i MySQL.
Här är fyra:
IFNULL()funktionCOALESCE()funktionIF()funktion kombinerad medIS NULL(ellerIS NOT NULL) operatörCASEuttryck kombinerat medIS NULL(ellerIS NOT NULL) operatör
Exempel på dessa alternativ finns nedan.
Exempeldata
Låt oss först ta några exempeldata:
USE Solutions; SELECT TaskCode From Tasks;
Resultat:
+----------+ | TaskCode | +----------+ | gar123 | | NULL | | NULL | | dog456 | | NULL | | cat789 | +----------+
Så vi har tre NULL-värden och tre icke-NULL-värden.
IFNULL()-funktionen
Med tanke på dess namn är detta förmodligen det mest uppenbara alternativet för att ersätta NULL-värden i MySQL. Denna funktion är i princip motsvarigheten till ISNULL() i SQL Server.
IFNULL() funktionen låter dig ange två argument. Det första argumentet returneras endast om det inte är NULL. Om det är NULL, returneras det andra argumentet istället.
Här är ett exempel på hur du använder IFNULL() mot vår exempeldatauppsättning:
SELECT IFNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Resultat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Här ersatte vi helt enkelt NULL-värden med N/A .
COALESCE()-funktionen
Denna funktion liknar IFNULL() funktion, men något annorlunda. Den här funktionen följer ANSI SQL standarden och den är allmänt distribuerad över olika RDBMS:er .
Så det fungerar är att du ger så många argument som du behöver. COALESCE() kommer då att returnera den första icke-NULL värde i listan, eller NULL om det inte finns några icke-NULL värden.
Så här:
SELECT COALESCE(TaskCode, 'N/A') AS Result FROM Tasks;
Resultat:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Så vi får exakt samma resultat som tidigare.
Skillnaden med den här funktionen är dock att du som nämnt kan tillhandahålla en lista med argument. COALESCE() funktionen tar det som är det första icke-NULL-värdet.
Så till exempel kan vi lägga till NULL som första argument och placera None före N/A och se vad som händer:
SELECT COALESCE(NULL, TaskCode, 'None', 'N/A') AS Result FROM Tasks;
Resultat:
+--------+ | Result | +--------+ | gar123 | | None | | None | | dog456 | | None | | cat789 | +--------+
Den hoppade över den första NULL som förväntat hoppade den över alla NULL-värden i TaskCode kolumn innan du väljer None . N/A värde användes inte i det här fallet eftersom None kom först och det är ett icke-NULL-värde.
IF()-funktionen kombinerad med IS NULL/IS NOT NULL
IS NULL och IS NOT NULL operatorer låter dig testa för NULL-värden och presentera ett annat värde beroende på resultatet.
Vi kan använda dessa operatorer i IF() funktion, så att icke-NULL-värden returneras, och NULL-värden ersätts med ett värde som vi väljer.
Exempel:
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å samma resultat som med IFNULL() och COALESCE() funktioner.
Och naturligtvis kan vi byta IS NOT NULL med IS NULL . Om vi gör det, skulle vi behöva byta ut de efterföljande argumenten också:
SELECT IF(TaskCode IS NULL, 'N/A', TaskCode) AS Result FROM Tasks;
CASE-uttrycket kombinerat med IS NULL/IS NOT NULL
Ett annat sätt att göra det är att använda CASE uttryck:
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 föregående exempel kan detta skrivas om till att använda IS NULL istället för IS NOT NULL :
SELECT
CASE
WHEN TaskCode IS NULL THEN 'N/A'
ELSE TaskCode
END AS Result
FROM Tasks;