Zpracování seznamů NUL

Dokončeno

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.

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

...

...

...

...