sql >> Database >  >> RDS >> Sqlserver

Omgaan met NULL's in SQL Server

Wat is NULL? NULL of de NULL-markering is de manier waarop we een onbekende waarde in SQL vertegenwoordigen, met SQL verwijs ik naar de standaard Structured Query Language, niet naar MS SQL Server. De laatste zin brengt ons een beetje terug naar 1969 toen de norm voor het eerst werd gedefinieerd door Dr. E.F. Codd. NULL wordt noodzakelijk omdat we moeten denken in termen van wat we predikatenlogica met drie waarden noemen. Een predikaat is de eigenschap van een uitdrukking die wel of niet geldt. Op het eerste gezicht zou je aan twee mogelijkheden denken:WAAR of ONWAAR. Er is echter een derde mogelijkheid:ONBEKEND.

Laten we een voorbeeld nemen. Ervan uitgaande dat een attribuut (kolom) in onze relatie (tabel) het belastingidentificatienummer (TIN) vertegenwoordigt van een reeks eigenaren van kleine bedrijven in Accra, Ghana. De kolom voor het record van elke bedrijfseigenaar wordt gevuld met zijn/haar TIN en we kunnen deze kolom gebruiken om een ​​ander kenmerk te bepalen, zoals of hij/zij up-to-date is in Belastingbetalingen. Er zijn echter twee extra mogelijkheden in dit geval:

  1. De bedrijfseigenaar heeft een TIN en is up-to-date.
  2. De bedrijfseigenaar heeft geen TIN en is (uiteraard) niet up-to-date.

Het bovenstaande beschrijft wat Dr. Codd predikaatlogica met vier waarden noemde. De SQL-standaard vereenvoudigt deze twee aanvullende voorwaarden echter door deze als onbekend te definiëren, d.w.z. NULL. We kennen het TIN van de bedrijfseigenaar niet en kunnen geen andere waarde bepalen op basis van het kenmerk van de betrokken bedrijfseigenaar. NULL is dus ONBEKEND en is de derde waarde in de standaard predikatenlogica met drie waarden.

NULL is speciaal

De definitie van NULL vereist dat de marker op een andere manier wordt behandeld dan de werkelijke waarden. Hier volgen enkele voorbeelden:

  1. Er bestaat niet zoiets als het filter "WHERE =NULL;". De juiste uitdrukking zou zijn:"WHERE IS NULL;". Hetzelfde geldt voor de omgekeerde uitdrukking.
  2. Bij het sorteren in oplopende volgorde van SQL kun je ervoor kiezen om NULL's als eerste of als laatste weer te geven. De standaardinstelling is om eerst NULL's weer te geven.
  3. U kunt NULL-waarden niet vergelijken. Dit zou duidelijk moeten zijn aangezien we hebben gezegd dat NULL ONBEKEND is.
  4. Als een aaneenschakelingspoging een NULL-kolom betreft, is het resultaat NULL.

Algemene NULL-gerelateerde functies

Hieronder volgen drie veelvoorkomende NULL-gerelateerde functies in SQL Server

ISNULL

ISNULL - Vervangt NULL door een opgegeven vervangingswaarde. Lijst 1 en Fig 1 tonen eenvoudige voorbeelden van 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:Eenvoudig voorbeeld van ISNULL

NULLIF

NULLIF geeft als resultaat NULL is de waarde van de twee argumenten die gelijk zijn.

-- 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:Eenvoudig voorbeeld van NULLIF

COALESCE

COALESCE retourneert de eerste niet-NULL-waarde uit de opgegeven lijst. Lijst 1 toont voorbeelden hiervan en figuur 1 toont de uitvoer van de zoekopdrachten.

-- 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:Eenvoudig voorbeeld van Coalesce

Merk op dat deze eenvoudige voorbeelden blootstaan ​​aan het gebruik van de aard van NULL. NULL en lege ruimte is NIET hetzelfde. In de eerste instructie retourneert COALESCE een spatie die ons laat zien dat een spatie de eerste niet-NULL-waarde in de lijst is.

Verschillen tussen ISNULL en COALESCE

De verschillen tussen ISNULL en COALESCE zijn het onderwerp geweest van verschillende online artikelen en boeken, zoals die vermeld in de sectie referenties. Deze verschillen worden als volgt samengevat:

  1. ISNULL is eigendom van SQL Server, terwijl COALESCE een ANSI-standaardfunctie is. Dit houdt in dat voor draagbaarheid COALESCE de voorkeur heeft.
  2. ISNULL heeft slechts twee argumenten, terwijl COALESCE meer dan twee argumenten kan aannemen.
  3. Het gegevenstype van de waarde die wordt geretourneerd door ISNULL wordt bepaald door het gegevenstype van het eerste argument, terwijl het gegevenstype van de waarde die wordt geretourneerd door COALESCE wordt bepaald door het gegevenstype in de lijst met de hoogste prioriteit.
  4. Als beide functies worden gebruikt met subquery's, presteert ISNULL beter omdat COALESCE intern wordt vertaald naar een CASE-expressie, waardoor het de neiging heeft om scans te herhalen.

Itzik Ben-Gan onderzoekt ook andere implicaties van de omzetting van COALESCE naar een casusuitdrukking in zijn artikel, waarvan de link aan het einde van dit artikel wordt gegeven.

Voorbeelden van gebruiksscenario's

We willen op een webportaal de lijst met klanten weergeven op basis van bepaalde criteria uit de tabel die we maken in Listing 4. Taken 1 en 2 geven aan mogelijke vereisten en we gebruiken ISNULL en COALESCE om aan de vereisten te voldoen.

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

Taak 1 :retourneer de lijst met alle klanten die geen alternatief telefoonnummer hebben opgegeven.

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

Met COALESCE (of ISNULL) kunnen we de benodigde informatie veel beter presenteren met de tekst 'Geen secundaire telefoon'.

Fig. 5 Resultaat ingesteld voor lijst 5

Taak 2 :retourneer de lijst met alle klanten, hun primaire telefoonnummer, en elk ander alternatief telefoonnummer.

--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 Resultaat ingesteld voor lijst 6

In dit geval is ISNULL geen optie omdat we drie argumenten doorgeven.

Conclusie

In dit artikel hebben we het concept van NULL besproken met betrekking tot predikaatlogica met drie waarden en hebben we populaire functies beschreven die we in SQL Server gebruiken om gegevenssets met NULL's te verwerken. We hebben ook voorbeelden gezien van hoe deze functies kunnen worden gebruikt. Veel andere referenties gaan dieper in op het gebruik, de voordelen en beperkingen van deze functies. Ik zou de boeken en blogs van Itzik Ben-Gan ten zeerste aanbevelen als goede informatiebronnen.

Referenties

  • NULLIF (Transact-SQL)
  • COALESCE (Transact-SQL)
  • Itzik Ben-Gan's artikel

  1. Windows PSQL-opdrachtregel:is er een manier om wachtwoordloos inloggen toe te staan?

  2. Postgres Query Plan waarom rijschatting zo verkeerd is

  3. Monitor SQL Database via SP_WhoIsActive of FogLight | Problemen met SQL Server-prestaties oplossen -1

  4. Is het mogelijk om retour in opgeslagen procedure te gebruiken?