sql >> Databáze >  >> RDS >> Sqlserver

Zacházení s hodnotami NULL v SQL Server

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:

  1. Vlastník firmy má TIN a je aktuální.
  2. 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:

  1. Neexistuje nic takového jako filtr „WHERE =NULL;“. Správný výraz by byl „WHERE IS NULL;“. Totéž platí pro obrácený výraz.
  2. 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.
  3. Nemůžete porovnávat hodnoty NULL. To by mělo být zřejmé, protože jsme řekli, že NULL je NEZNÁMÝ.
  4. 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:

  1. ISNULL je proprietární pro SQL Server, zatímco COALESCE je standardní funkce ANSI. To znamená, že pro přenositelnost je preferována COALESCE.
  2. ISNULL přebírá pouze dva argumenty, zatímco COALESCE může mít více než dva argumenty.
  3. 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.
  4. 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

  1. Jak naplnit tabulku rozsahem dat?

  2. Jak mohu zkombinovat více řádků do seznamu odděleného čárkami v SQL Server 2005?

  3. SQL, vytvoření tabulky

  4. Jak exportovat data pole clob ve vývojáři Oracle SQL