Zpracování seznamů NUL
Hodnota NULL znamená žádnou nebo neznámou hodnotu. Neznamená to nula nebo prázdné, ani prázdný řetězec. Tyto hodnoty nejsou neznámé. Hodnotu NULL je možné použít pro hodnoty, které ještě nebyly zadány, například pokud zákazník ještě nezadali e-mailovou adresu. Jak jste viděli dříve, některé funkce převodu můžou vrátit také hodnotu NULL, pokud hodnota není kompatibilní s cílovým datovým typem.
Často budete muset provést speciální kroky pro řešení hodnoty NULL. Hodnota NULL je opravdu nehodnotová. Není to známo. Nic se nerovná a není to stejné jako nic. Hodnota NULL není větší nebo menší než cokoli. Nemůžeme říct nic o tom, co to je, ale někdy potřebujeme pracovat s hodnotami NULL. T-SQL naštěstí poskytuje funkce pro převod nebo nahrazení hodnot NULL.
ISNULL
Funkce ISNULL přebírá dva argumenty. První je výraz, který testujeme. Pokud je hodnota tohoto prvního argumentu NULL, vrátí funkce druhý argument. Pokud první výraz nemá hodnotu null, vrátí se beze změny.
Předpokládejme například, že tabulka Sales.Customer v databázi obsahuje sloupec MiddleName , který umožňuje hodnoty NULL. Při dotazování na tuto tabulku se místo vrácení hodnoty NULL ve výsledku můžete rozhodnout vrátit konkrétní hodnotu, například None.
SELECT FirstName,
ISNULL(MiddleName, 'None') AS MiddleIfAny,
LastName
FROM Sales.Customer;
Výsledky z tohoto dotazu můžou vypadat nějak takto:
FirstName
MiddleIfAny
LastName
Orlando
N.
Jé
Keith
Nic
Howard
Donna
F.
Gonzales
...
...
...
Poznámka:
Hodnota nahrazená hodnotou NULL musí být stejný datový typ jako výraz, který se vyhodnocuje. V předchozím příkladu je MiddleName varchar, takže náhradní hodnota nemůže být číselná. Kromě toho budete muset zvolit hodnotu, která se v datech nezobrazí jako běžná hodnota. Někdy může být obtížné najít hodnotu, která se ve vašich datech nikdy nezobrazí.
Předchozí příklad zpracoval hodnotu NULL ve zdrojové tabulce, ale můžete použít ISNULL s libovolným výrazem, který by mohl vrátit hodnotu NULL, včetně vnoření TRY_CONVERT funkce v rámci funkce ISNULL.
COALESCE
Funkce ISNULL není standard ANSI, takže místo toho můžete chtít použít funkci COALESCE. FUNKCE COALESCE je o něco flexibilnější, protože může mít proměnlivý počet argumentů, z nichž každý je výraz. Vrátí první výraz v seznamu, který nemá hodnotu NULL.
Pokud existují pouze dva argumenty, funkce COALESCE se chová jako ISNULL. S více než dvěma argumenty však můžete funkci COALESCE použít jako alternativu k výrazu CASE s více částmi pomocí funkce ISNULL.
Pokud jsou všechny argumenty NULL, vrátí funkce COALESCE hodnotu NULL. Všechny výrazy musí vracet stejné nebo kompatibilní datové typy.
Syntaxe je následující:
SELECT COALESCE ( expression1, expression2, [ ,...n ] )
Následující příklad používá fiktivní tabulku s názvem HR. Mzdy, které obsahují tři sloupce obsahující informace o týdenních výdělcích zaměstnanců: hodinová sazba, týdenní mzda a provize za prodané jednotky. Zaměstnanec však obdrží pouze jeden typ platby. Pro každého zaměstnance bude mít jeden z těchto tří sloupců hodnotu, ostatní dva budou null. Chcete-li určit celkovou částku zaplacenou jednotlivým zaměstnancům, můžete pomocí funkce COALESCE vrátit pouze hodnotu, která není null nalezená v těchto třech sloupcích.
SELECT EmployeeID,
COALESCE(HourlyRate * 40,
WeeklySalary,
Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;
Výsledky můžou vypadat přibližně takto:
EmployeeID
Týdenní naučení
0
899.76
2
1001.00
3
1298.77
...
...
NULLIF
Funkce NULLIF umožňuje vrátit hodnotu NULL za určitých podmínek. Tato funkce má užitečné aplikace v oblastech, jako je čištění dat, pokud chcete nahradit prázdné nebo zástupné znaky hodnotou NULL.
Funkce NULLIF přebírá dva argumenty a vrátí hodnotu NULL, pokud jsou ekvivalentní. Pokud se nerovnají, vrátí funkce NULLIF první argument.
V tomto příkladu nullIF nahradí slevu 0 hodnotou NULL. Vrátí hodnotu slevy, pokud není 0:
SELECT SalesOrderID,
ProductID,
UnitPrice,
NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;
Výsledky můžou vypadat přibližně takto:
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
...
...
...
...