Co je NULL? NULL nebo značka NULL je způsob, jakým představujeme neznámou hodnotu v SQL, SQL mám na mysli standardní strukturovaný dotazovací jazyk, nikoli MS SQL Server. Poslední věta nás zavede trochu zpět do roku 1969, kdy standard poprvé definoval Dr. E. F. Codd. NULL se stává nezbytnou, protože musíme přemýšlet v pojmech toho, čemu se říká trojhodnotová predikátová logika. Predikát je vlastnost výrazu, který buď platí, nebo neplatí. Při nominální hodnotě by člověk myslel na dvě možnosti:PRAVDA nebo NEPRAVDA. Existuje však třetí možnost:NEZNÁMÁ.
Vezměme si příklad. Za předpokladu, že atribut (sloupec) v našem vztahu (tabulka) představuje daňové identifikační číslo (TIN) množiny vlastníků malých podniků v Akkře v Ghaně. Sloupec pro záznam každého vlastníka firmy bude vyplněn jeho/její DIČ a tento sloupec můžeme použít k určení některých dalších atributů, například zda má aktuální údaje o platbách daní. V tomto případě použití však existují dvě další možnosti:
- Vlastník firmy má TIN a je aktuální.
- Vlastník firmy nemá TIN a není (samozřejmě) aktuální.
Výše uvedené popisuje to, co Dr. Codd nazval čtyřhodnotovou predikátovou logikou. Standard SQL však tyto dvě dodatečné podmínky zjednodušuje tím, že je definuje jako neznámé, tj. NULL. Neznáme DIČ vlastníka firmy a nemůžeme určit žádnou jinou hodnotu z atributu dotčeného vlastníka firmy. Takže NULL je NEZNÁMÁ a je třetí hodnotou ve standardní trojhodnotové predikátové logice.
NULL je speciální
Definice NULL vyžaduje zacházení s markerem jiným způsobem, než jsou skutečné hodnoty. Následují příklady:
- Neexistuje nic takového jako filtr „WHERE =NULL;“. Správný výraz by byl „WHERE IS NULL;“. Totéž platí pro obrácený výraz.
- Při řazení ve vzestupném pořadí SQL si můžete vybrat, zda chcete uvést hodnoty NULL jako první nebo jako poslední. Ve výchozím nastavení jsou nejprve uvedeny hodnoty NULL.
- Nemůžete porovnávat hodnoty NULL. To by mělo být zřejmé, protože jsme řekli, že NULL je NEZNÁMÝ.
- Pokud pokus o zřetězení zahrnuje sloupec NULL, výsledek je NULL.
Běžné funkce související s NULL
Následují tři běžné funkce související s NULL v SQL Server
ISNULL
ISNULL – Nahradí NULL zadanou náhradní hodnotou. Výpis 1 a obr. 1 ukazují jednoduché příklady ISNULL.
-- Listing 1: Simple Example of ISSNULL SELECT ISNULL (NULL, 3) NULLREPLACEMENT; SELECT ISNULL (NULL,'GREEN') NULLREPLACEMENT; SELECT ISNULL (NULL,'2018-12-25') NULLREPLACEMENT;
Obr. 1:Jednoduchý příklad ISNULL
NULLIF
NULLIF vrátí hodnotu NULL je hodnota dvou argumentů se rovná.
-- Listing 2: Simple Example of NULLIF SELECT NULLIF(3,3) AS NULLIFF; SELECT NULLIF(3,5) AS NULLIFF; SELECT NULLIF('RED','RED') AS NULLIFF; SELECT NULLIF('GREEN','RED') AS NULLIFF;
Obr. 2:Jednoduchý příklad NULLIF
COALESCE
COALESCE vrátí první hodnotu, která není NULL z poskytnutého seznamu. Výpis 1 ukazuje příklady tohoto a obr. 1 ukazuje výstup dotazů.
-- Listing 3: Simple Example of COALESCE SELECT COALESCE (NULL,'','GREEN','','') AS NULLRESPONSE; SELECT COALESCE (NULL,'GREEN','HOPE','') AS NULLRESPONSE; SELECT COALESCE (1,'','GREEN','','') AS NULLRESPONSE;
Obr. 3:Jednoduchý příklad sloučení
Všimněte si, že tyto jednoduché příklady ukazují použití povahy NULL. NULL a prázdné místo NENÍ totéž. V prvním příkazu COALESCE vrátí prázdné místo, které nám ukazuje, že prázdné místo je první hodnotou v seznamu, která není NULL.
Rozdíly mezi ISNULL a COALESCE
Rozdíly mezi ISNULL a COALESCE byly předmětem několika online článků a také knih, jako jsou ty, které jsou uvedeny v sekci reference. Tyto rozdíly jsou shrnuty takto:
- ISNULL je proprietární pro SQL Server, zatímco COALESCE je standardní funkce ANSI. To znamená, že pro přenositelnost je preferována COALESCE.
- ISNULL přebírá pouze dva argumenty, zatímco COALESCE může mít více než dva argumenty.
- Datový typ hodnoty vrácené ISNULL je určen datovým typem prvního argumentu, zatímco datový typ hodnoty vrácené COALESCE je určen datovým typem v seznamu s nejvyšší prioritou.
- Když jsou obě funkce použity s poddotazy, ISNULL funguje lépe, protože COALESCE je interně přeloženo do CASE výrazu, takže má tendenci opakovat skenování.
Itzik Ben-Gan ve svém článku, jehož odkaz je uveden na konci tohoto článku, také zkoumá další důsledky převodu COALESCE na případový výraz.
Příklady použití
Chceme na webovém portálu zobrazovat seznam zákazníků na základě určitých kritérií z tabulky, kterou vytváříme ve výpisu 4. Úkoly 1 a 2 dávají možným požadavkům a ke splnění požadavků používáme ISNULL a COALESCE.
--Listing 4: Table Creation Script CREATE TABLE CUSTOMER (ID INT IDENTITY (1,1) ,FIRSTNAME VARCHAR(50) ,LASTNAME VARCHAR(50) ,SEX CHAR(1) ,ADDRESS VARCHAR(300) ,FIRSTTRANDATE DATETIME ,PHONENUMBER1 BIGINT ,PHONENUMBER2 BIGINT ,PHONENUMBER3 BIGINT); GO INSERT INTO CUSTOMER VALUES ('KENNETH','IGIRI','M','ACCRA, GHANA',GETDATE(),'0245335678','0555335678',NULL); INSERT INTO CUSTOMER VALUES ('RICHARD','HANO','M','BUDAPEST, HUNGARY',GETDATE(),'889189400122',NULL,NULL); INSERT INTO CUSTOMER VALUES ('GEORGINA','APPIAH','F','ACCRA, GHANA','09-16-2018','02456665678','0275339678',NULL); INSERT INTO CUSTOMER VALUES ('HOWARD','KLEVIA',NULL,'HAGUE, SWITZERLAND','02-16-2017','3499285782',NULL,NULL); INSERT INTO CUSTOMER VALUES ('ZEN','GREGOR',NULL,'SHANGHAI, CHINA','06-23-2018','0245335678','0555335678',NULL); INSERT INTO CUSTOMER VALUES ('IHEOMA','AWA','F','LAGOS, NIGERIA',GETDATE(),'0245335678','0555335678',NULL);
Obr. 4 Vzorová tabulka
Úkol 1 :Vrátit seznam všech zákazníků, kteří neuvedli alternativní telefonní číslo.
--Listing 5: Table List of Customers with no Secondary Phones --A: The Simple Answer SELECT * FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ; --B: Presenting the Result Set Better SELECT FIRSTNAME ,LASTNAME ,ADDRESS ,FIRSTTRANDATE ,PHONENUMBER1 AS [PRIMARY PHONE NUMBER] ,ISNULL(CAST(PHONENUMBER2 AS VARCHAR), 'NO SECONDARY PHONE') AS [SECONDARY PHONE NUMBER] FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;
Pomocí COALESCE (nebo ISNULL) můžeme požadované informace prezentovat mnohem lépe pomocí textu, který říká ‚Žádný sekundární telefon‘.
Obr. 5 Sada výsledků pro výpis 5
Úkol 2 :Vrátit seznam všech zákazníků, jejich primární telefonní číslo, ajakékoli jiné alternativní telefonní číslo.
--Listing 6: Table List of Customers with an Other Alternate Number SELECT FIRSTNAME ,LASTNAME ,ADDRESS ,FIRSTTRANDATE ,PHONENUMBER1 AS [PRIMARY PHONE NUMBER] ,COALESCE(CAST(PHONENUMBER2 AS VARCHAR),CAST(PHONENUMBER3 AS VARCHAR), 'NO OTHER PHONE') AS [OTHER PHONE NUMBER] FROM CUSTOMER ;
Obr. 6 Sada výsledků pro výpis 6
V tomto případě ISNULL není možnost, protože předáváme tři argumenty.
Závěr
V tomto článku jsme diskutovali o konceptu NULL, protože se vztahuje k trojhodnotové predikátové logice, a popsali jsme oblíbené funkce, které používáme na serveru SQL Server k řešení datových sad obsahujících hodnoty NULL. Viděli jsme také příklady, jak lze tyto funkce použít. Mnoho dalších odkazů se hlouběji zabývá použitím, výhodami a omezeními těchto funkcí. Vřele bych doporučil knihy a blogy Itzika Ben-Gana jako dobrý zdroj informací.
Odkazy
- NULLIF (Transact-SQL)
- COALESCE (Transact-SQL)
- Článek Itzika Ben-Gana