sql >> Databasteknik >  >> RDS >> Sqlserver

Hantera NULLs i SQL Server

Vad är NULL? NULL eller NULL-markören är hur vi representerar ett okänt värde i SQL, med SQL syftar jag på standarden Structured Query Language, inte MS SQL Server. Den sista meningen tar oss lite tillbaka till 1969 när standarden först definierades av Dr E.F. Codd. NULL blir nödvändigt eftersom vi behöver tänka i termer av det som kallas trevärdig predikatlogik. Ett predikat är egenskapen hos ett uttryck som antingen håller eller inte håller. Till nominellt värde skulle man kunna tänka sig två möjligheter:SANT eller FALSKT. Det finns dock en tredje möjlighet:OKÄND.

Låt oss ta ett exempel. Om vi ​​antar att ett attribut (kolumn) i vår relation (tabell) representerar Tax Identification Number (TIN) för en uppsättning småföretagare i Accra, Ghana. Kolumnen för varje företagsägares register kommer att fyllas i med hans/hennes TIN och vi kan använda den här kolumnen för att avgöra något annat attribut, till exempel om han/hon är uppdaterad i skattebetalningar. Det finns dock två extra möjligheter i detta användningsfall:

  1. Företagsägaren har ett TIN och är uppdaterad.
  2. Företagsägaren har inte ett TIN och är (uppenbarligen) inte uppdaterad.

Ovanstående beskriver vad Dr. Codd kallade fyrvärdspredikatlogik. SQL-standarden förenklar dock dessa två ytterligare villkor genom att definiera den som okänd, dvs NULL. Vi känner inte till företagsägarens TIN och kan inte fastställa något annat värde utifrån den berörda företagsägarens attribut. Så NULL är OKÄNT och är det tredje värdet i standardlogik med tre värden för predikat.

NULL är Special

Definitionen av NULL kräver behandling av markören på ett annat sätt än faktiska värden. Följande är exempel:

  1. Det finns inget sådant som filtret "WHERE =NULL;". Det korrekta uttrycket skulle "WHERE IS NULL;". Detsamma gäller det omvända uttrycket.
  2. När du sorterar i stigande SQL-ordning kan du välja att lista NULL först eller sist. Standard är att lista NULL först.
  3. Du kan inte jämföra NULL-värden. Detta borde vara uppenbart eftersom vi har sagt att NULL är OKÄNT.
  4. När ett sammanfogningsförsök involverar en NULL-kolumn, är resultatet NULL.

Vanliga NULL-relaterade funktioner

Följande är tre vanliga NULL-relaterade funktioner i SQL Server

INNULL

ISNULL – Ersätter NULL med ett specificerat ersättningsvärde. Lista 1 och Fig 1 visar enkla exempel på ISNULL.

-- Listing 1: Simple Example of ISSNULL
SELECT ISNULL (NULL, 3) NULLREPLACEMENT;
SELECT ISNULL (NULL,'GREEN') NULLREPLACEMENT;
SELECT ISNULL (NULL,'2018-12-25') NULLREPLACEMENT;

Fig 1:Enkelt exempel på ISNULL

NULLIF

NULLIF returnerar NULL är värdet av de två argumenten är lika.

-- 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;

Fig. 2:Enkelt exempel på NULLIF

COALESCE

COALESCE returnerar det första icke-NULL-värdet från den angivna listan. Lista 1 visar exempel på detta och Fig 1 visar utdata från frågorna.

-- 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;

Fig 3:Enkelt exempel på sammansmältning

Lägg märke till att dessa enkla exempel visar hur NULL används. NULL och blanksteg är INTE samma sak. I den första satsen returnerar COALESCE ett blanksteg som visar oss att ett blanksteg är det första icke-NULL-värdet i listan.

Skillnader mellan ISNULL och COALESCE

Skillnaderna mellan ISNULL och COALESCE har varit föremål för flera onlineartiklar samt böcker som de som listas i referenssektionen. Dessa skillnader sammanfattas enligt följande:

  1. ISNULL är tillhörande SQL Server medan COALESCE är en ANSI-standardfunktion. Detta innebär att för portabilitet är COALESCE att föredra.
  2. ISNULL tar bara två argument medan COALESCE kan ta mer än två argument.
  3. Datatypen för värdet som returneras av ISNULL bestäms av datatypen för det första argumentet medan datatypen för värdet som returneras av COALESCE bestäms av datatypen i listan med högst prioritet.
  4. När båda funktionerna används med underfrågor, presterar ISNULL bättre eftersom COALESCE internt översätts till ett CASE-uttryck vilket gör att det tenderar att upprepa skanningar.

Itzik Ben-Gan utforskar också andra implikationer av omvandlingen av COALESCE till ett falluttryck i sin artikel, vars länk finns i slutet av denna artikel.

Exempel på användningsfall

Vi vill visa på en webbportal listan över kunder baserat på vissa kriterier från tabellen vi skapar i Lista 4. Uppgifter 1 och 2 ger till möjliga krav och vi använder ISNULL och COALESCE för att uppfylla kraven.

--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);

Fig. 4 Exempeltabell

Uppgift 1 :Returnera listan över alla kunder som inte har angett ett alternativt telefonnummer.

--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 ;

Med COALESCE (eller ISNULL) kan vi presentera den information som krävs mycket bättre med en text som säger "Ingen sekundär telefon".

Fig. 5 Resultatuppsättning för listning 5

Uppgift 2 :Returnera listan över alla kunder, deras primära telefonnummer, och alla andra alternativa telefonnummer.

--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  ;

Fig. 6 Resultatuppsättning för listning 6

I det här fallet är ISNULL inte ett alternativ eftersom vi skickar tre argument.

Slutsats

I den här artikeln har vi diskuterat konceptet NULL eftersom det relaterar till logik med tre värden för predikat och beskrivit populära funktioner som vi använder i SQL Server för att hantera datamängder som innehåller NULL. Vi har också sett exempel på hur dessa funktioner kan användas. Många andra referenser går djupare in i användningen, fördelarna och begränsningarna med dessa funktioner. Jag rekommenderar starkt Itzik Ben-Gans böcker och bloggar som bra informationskällor.

Referenser

  • NULLIF (Transact-SQL)
  • COALESCE (Transact-SQL)
  • Itzik Ben-Gans artikel

  1. De bästa MySQL Workbench-alternativen

  2. ScaleGrid lanserar stöd för Google Cloud Platform (GCP) för Managed Database Hosting

  3. Salesforce SOQL från Crystal Reports

  4. De bästa tillgängliga databasövervakningsalternativen för ditt företag