När du frågar efter en SQL Server-databas kan det finnas tillfällen då du inte vill att null-värden ska returneras i din resultatuppsättning. Och det kan finnas tillfällen då du vill ha dem tillbaka. Men det kan också finnas tillfällen då du vill ha dem tillbaka, men som ett annat värde.
Det är vad ISNULL()
funktionen är för.
ISNULL()
är en T-SQL-funktion som låter dig ersätta NULL
med ett angivet värde som du väljer.
Exempel
Här är en grundläggande fråga som returnerar en liten resultatuppsättning:
SELECT TaskCode AS Result FROM Tasks;
Resultat:
Result ------ cat123 null null pnt456 rof789 null
Vi kan se att det finns tre rader som innehåller nollvärden.
Om vi inte vill att null-värdena ska visas som sådana kan vi använda ISNULL()
för att ersätta null
med ett annat värde.
Så här:
SELECT ISNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Resultat:
Result ------ cat123 N/A N/A pnt456 rof789 N/A
Vi kan också ersätta den med den tomma strängen:
SELECT ISNULL(TaskCode, '') AS Result FROM Tasks;
Resultat:
Result ------ cat123 pnt456 rof789
Observera att ISNULL()
kräver att det andra argumentet är av en typ som implicit kan konverteras till datatypen för det första argumentet. Det beror på att det returnerar resultatet med hjälp av datatypen för det första argumentet.
Förhindra nullrader från att försvinna
Det finns vissa T-SQL-funktioner där nollvärden elimineras från resultatuppsättningen. I sådana fall kommer null-värden inte att returneras alls.
Även om detta kan vara ett önskvärt resultat i vissa fall, kan det i andra fall vara katastrofalt, beroende på vad du behöver göra med informationen när den väl har returnerats.
Ett exempel på en sådan funktion är STRING_AGG()
. Denna funktion låter dig returnera resultatuppsättningen som en avgränsad lista. Men det eliminerar också nollvärden från resultatuppsättningen. Så om vi använder den här funktionen med ovanstående exempeldata, skulle vi sluta med tre resultat istället för sex:
SELECT STRING_AGG(TaskCode, ', ') AS Result FROM Tasks;
Resultat:
Result ---------------------- cat123, pnt456, rof789
Så de tre raderna som innehåller null-värden returneras inte.
I många fall är detta ett perfekt resultat, eftersom vår resultatuppsättning inte är belamrad med nollvärden. Detta kan dock också orsaka problem, beroende på vad data ska användas till.
Därför, om vi vill behålla raderna med nollvärden, kan vi använda ISNULL()
för att ersätta null-värdena med ett annat värde:
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
Resultat:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
COALESCE()-funktionen
ISNULL()
funktionen fungerar på liknande sätt som COALESCE()
fungera. Så vi kan ersätta ovanstående kod med denna:
SELECT STRING_AGG(COALESCE(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
Och få samma resultat:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Det finns dock vissa skillnader i hur de två funktionerna beter sig. För mer information om skillnaderna, här är en jämförelse av COALESCE()
och ISNULL()
på Microsofts webbplats.