Hantera NULLL:er
Ett NULL-värde innebär inget värde eller okänt. Det betyder inte noll eller tom, eller ens en tom sträng. Dessa värden är inte okända. Ett NULL-värde kan användas för värden som inte har angetts ännu, till exempel när en kund ännu inte har angett någon e-postadress. Som du har sett tidigare kan ett NULL-värde också returneras av vissa konverteringsfunktioner om ett värde inte är kompatibelt med måldatatypen.
Du måste ofta vidta särskilda åtgärder för att hantera NULL. NULL är verkligen ett icke-värde. Det är okänt. Det är inte lika med något, och det är inte ojämlikt mot någonting. NULL är inte större eller mindre än något annat. Vi kan inte säga något om vad det är, men ibland måste vi arbeta med NULL-värden. T-SQL tillhandahåller tack och lov funktioner för konvertering eller ersättning av NULL-värden.
ISNULL
Funktionen ISNULL tar två argument. Det första är ett uttryck som vi testar. Om värdet för det första argumentet är NULL returnerar funktionen det andra argumentet. Om det första uttrycket inte är null returneras det oförändrat.
Anta till exempel att tabellen Sales.Customer i en databas innehåller en MiddleName-kolumn som tillåter NULL-värden. När du kör frågor mot den här tabellen, i stället för att returnera NULL i resultatet, kan du välja att returnera ett specifikt värde, till exempel "Ingen".
SELECT FirstName,
ISNULL(MiddleName, 'None') AS MiddleIfAny,
LastName
FROM Sales.Customer;
Resultatet från den här frågan kan se ut ungefär så här:
FirstName
MiddleIfAny
LastName
Orlando
N.
Jösses
Keith
Ingen
Howard
Donna
F.
Gonzales
...
...
...
Kommentar
Värdet som ersätts med NULL måste vara samma datatyp som uttrycket som utvärderas. I exemplet ovan är MiddleName ett varchar, så ersättningsvärdet kunde inte vara numeriskt. Dessutom måste du välja ett värde som inte visas i data som ett vanligt värde. Ibland kan det vara svårt att hitta ett värde som aldrig visas i dina data.
I föregående exempel hanterades ett NULL-värde i källtabellen, men du kan använda ISNULL med alla uttryck som kan returnera en NULL, inklusive kapsling av en TRY_CONVERT funktion i en ISNULL-funktion.
COALESCE
FUNKTIONEN ISULL är inte ANSI-standard, så du kanske vill använda funktionen COALESCE i stället. COALESCE är lite mer flexibelt eftersom det kan ta ett variabelt antal argument, som var och en är ett uttryck. Det returnerar det första uttrycket i listan som inte är NULL.
Om det bara finns två argument beter sig COALESCE som ISNULL. Men med fler än två argument kan COALESCE användas som ett alternativ till ett CASE-uttryck med flera delar med HJÄLP av ISNULL.
Om alla argument är NULL returnerar COALESCE NULL. Alla uttryck måste returnera samma eller kompatibla datatyper.
Syntaxen ser ut så här:
SELECT COALESCE ( expression1, expression2, [ ,...n ] )
I följande exempel används en fiktiv tabell med namnet HR. Löner, som innehåller tre kolumner som innehåller information om de anställdas veckolöner: timlönen, veckolönen och en såld provision per enhet. En anställd får dock bara en typ av lön. För varje anställd har en av dessa tre kolumner ett värde, de andra två är NULL. För att fastställa det totala beloppet som betalas till varje anställd kan du använda COALESCE för att endast returnera värdet som inte är null i dessa tre kolumner.
SELECT EmployeeID,
COALESCE(HourlyRate * 40,
WeeklySalary,
Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;
Resultatet kan se ut ungefär så här:
EmployeeID
WeeklyEarnings
1
899.76
2
1001.00
3
1298.77
...
...
NULLIF
Med funktionen NULLIF kan du returnera NULL under vissa villkor. Den här funktionen har användbara program inom områden som datarensning, när du vill ersätta tomma tecken eller platshållartecken med NULL.
NULLIF tar två argument och returnerar NULL om de är likvärdiga. Om de inte är lika med returnerar NULLIF det första argumentet.
I det här exemplet ersätter NULLIF en rabatt på 0 med en NULL. Det returnerar rabattvärdet om det inte är 0:
SELECT SalesOrderID,
ProductID,
UnitPrice,
NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;
Resultatet kan se ut ungefär så här:
SalesOrderID
ProductID
UnitPrice
Discount
71774
836
356.898
NULL
71780
988
112.998
0,4
71781
748
818.7
NULL
71781
985
112.998
0,4
...
...
...
...