sql >> Database teknologi >  >> RDS >> Sqlserver

Håndtering af NULL'er i SQL Server

Hvad er NULL? NULL eller NULL-markøren er den måde, vi repræsenterer en ukendt værdi i SQL, ved SQL refererer jeg til standarden Structured Query Language, ikke MS SQL Server. Den sidste sætning fører os lidt tilbage til 1969, hvor standarden først blev defineret af Dr. E.F. Codd. NULL bliver nødvendigt, fordi vi skal tænke i det, der kaldes tre-værdi prædikatlogik. Et prædikat er egenskaben af ​​et udtryk, der enten holder eller ikke holder. Til pålydende ville man tænke på to muligheder:SAND eller FALSK. Der er dog en tredje mulighed:UKENDT.

Lad os tage et eksempel. Hvis vi antager, at en attribut (kolonne) i vores relation (tabel) repræsenterer Tax Identification Number (TIN) for et sæt små virksomhedsejere i Accra, Ghana. Kolonnen for hver virksomhedsejers post vil blive udfyldt med hans/hendes TIN, og vi kan bruge denne kolonne til at bestemme en anden egenskab, såsom om han/hun er opdateret i skattebetalinger. Der er dog to ekstra muligheder i denne brugssituation:

  1. Virksomhedsejeren har et TIN og er opdateret.
  2. Virksomhedsejeren har ikke et TIN og er (naturligvis) ikke opdateret.

Ovenstående beskriver, hvad Dr. Codd kaldte fire-værdi prædikatlogik. SQL-standarden forenkler imidlertid disse to yderligere betingelser ved at definere den som ukendt, dvs. NULL. Vi kender ikke virksomhedsejerens TIN og kan ikke bestemme nogen anden værdi ud fra den berørte virksomhedsejers egenskab. Så NULL er UKENDT og er den tredje værdi i standard tre-værdi prædikatlogik.

NULL er speciel

Definitionen af ​​NULL nødvendiggør behandling af markøren på en anden måde end de faktiske værdier. Følgende er eksempler:

  1. Der er ikke noget, der hedder filteret "WHERE =NULL;". Det korrekte udtryk ville være "WHERE IS NULL;". Det samme gælder for det omvendte udtryk.
  2. Når du sorterer i stigende rækkefølge SQL, kan du vælge at angive NULL først eller sidst. Standarden er at vise NULL først.
  3. Du kan ikke sammenligne NULL-værdier. Dette burde være indlysende, da vi har sagt, at NULL er Ukendt.
  4. Når et sammenkædningsforsøg involverer en NULL-kolonne, er resultatet NULL.

Almindelige NULL-relaterede funktioner

Følgende er tre almindelige NULL-relaterede funktioner i SQL Server

NULLE

ISNULL – Erstatter NULL med en specificeret erstatningsværdi. Liste 1 og Fig. 1 viser simple eksempler 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:Simpelt eksempel på ISNULL

NULLIF

NULLIF returnerer NULL er værdien af ​​de to argumenter er ens.

-- 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:Simpelt eksempel på NULLIF

COALESCE

COALESCE returnerer den første ikke-NULL værdi fra den angivne liste. Liste 1 viser eksempler på dette, og fig. 1 viser outputtet af forespørgslerne.

-- 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:Simpelt eksempel på sammensmeltning

Bemærk, at disse simple eksempler viser brugen af ​​NULL. NULL og blank plads er IKKE det samme. I den første sætning returnerer COALESCE et tomt mellemrum, der viser os, at et tomt mellemrum er den første ikke-NULL-værdi på listen.

Forskelle mellem ISNULL og COALESCE

Forskellene mellem ISNULL og COALESCE har været genstand for adskillige online artikler samt bøger som dem, der er anført i referencesektionen. Disse forskelle er opsummeret som følger:

  1. ISNULL er ejet af SQL Server, mens COALESCE er en ANSI-standardfunktion. Dette indebærer, at COALESCE foretrækkes af hensyn til bærbarhed.
  2. ISNULL tager kun to argumenter, mens COALESCE kan tage mere end to argumenter.
  3. Datatypen for værdien returneret af ISNULL bestemmes af datatypen for det første argument, mens datatypen for værdien returneret af COALESCE bestemmes af datatypen på listen med den højeste prioritet.
  4. Når begge funktioner bruges med underforespørgsler, yder ISNULL bedre, fordi COALESCE internt er oversat til et CASE-udtryk, hvilket gør det tilbøjeligt til at gentage scanninger.

Itzik Ben-Gan udforsker også andre implikationer af konverteringen af ​​COALESCE til et case-udtryk i sin artikel, hvortil der er linket i slutningen af ​​denne artikel.

Eksempler på brugssituationer

Vi ønsker at vise listen over kunder på en webportal baseret på bestemte kriterier fra den tabel, vi opretter i liste 4. Opgave 1 og 2 giver til mulige krav, og vi bruger ISNULL og COALESCE til at opfylde kravene.

--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 Prøvetabel

Opgave 1 :Returner listen over alle kunder, der ikke har angivet et 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 ;

Ved at bruge COALESCE (eller ISNULL) kan vi præsentere den nødvendige information meget bedre ved at bruge en tekst, der siger "Ingen sekundær telefon".

Fig. 5 Resultatsæt for liste 5

Opgave 2 :Returner listen over alle kunder, deres primære telefonnummer, og ethvert andet alternativt 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 Resultatsæt for liste 6

I dette tilfælde er ISNULL ikke en mulighed, da vi sender tre argumenter.

Konklusion

I denne artikel har vi diskuteret begrebet NULL, da det relaterer til tre-værdi prædikatlogik og beskrevet populære funktioner, vi bruger i SQL Server til at håndtere datasæt, der indeholder NULL'er. Vi har også set eksempler på, hvordan disse funktioner kan bruges. Mange andre referencer dykker dybere ned i brugen, fordelene og begrænsningerne ved disse funktioner. Jeg vil varmt anbefale Itzik Ben-Gans bøger og blogs som gode informationskilder.

Referencer

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

  1. Databaseindeksering i PostgreSQL

  2. Brug af en IF-erklæring i en MySQL SELECT-forespørgsel

  3. Hvordan kontrollerer man, om der findes en kolonne i en SQL Server-tabel?

  4. Laravel Eloquent vælg alle rækker med max created_at