Zoeken…


Invoering

In SQL Server staat NULL voor gegevens die ontbreken of onbekend zijn. Dit betekent dat NULL niet echt een waarde is; het is beter te omschrijven als een tijdelijke aanduiding voor een waarde. Dit is ook de reden waarom je NULL met geen enkele waarde kunt vergelijken, en zelfs niet met een andere NULL .

Opmerkingen

SQL Server biedt andere methoden om ISNULL() te handelen, zoals IS NULL , IS NOT NULL , ISNULL() , COALESCE() en andere.

NULL vergelijking

NULL is een speciaal geval als het gaat om vergelijkingen.

Ga uit van de volgende gegevens.

id someVal
 ----
 0 NULL
 1 1
 2 2

Met een vraag:

 SELECT id
 FROM table
 WHERE someVal = 1

zou id 1 retourneren

 SELECT id
 FROM table
 WHERE someVal <> 1

zou id 2 retourneren

 SELECT id
 FROM table
 WHERE someVal IS NULL

zou id 0 retourneren

 SELECT id
 FROM table
 WHERE someVal IS NOT NULL

zou beide id's 1 en 2 teruggeven.

Als u NULL's wilde laten "tellen" als waarden in een = , <> vergelijking, moet deze eerst worden omgezet in een telbaar gegevenstype:

 SELECT id
 FROM table
 WHERE ISNULL(someVal, -1) <> 1

OF

 SELECT id
 FROM table
 WHERE someVal IS NULL OR someVal <> 1

geeft 0 en 2

Of u kunt uw ANSI Null- instelling wijzigen.

ANSI NULLS

Van MSDN

In een toekomstige versie van SQL Server zal ANSI_NULLS altijd AAN zijn en alle applicaties die de optie expliciet op UIT zetten zullen een fout genereren. Vermijd het gebruik van deze functie in nieuw ontwikkelwerk en ben van plan om toepassingen te wijzigen die momenteel deze functie gebruiken.

ANSI NULLS die zijn uitgeschakeld, maken een = / <> vergelijking van null-waarden mogelijk.

Gezien de volgende gegevens:

id someVal
 ----
 0 NULL
 1 1
 2 2

En met ANSI NULLS aan, deze vraag:

 SELECT id
 FROM table
 WHERE someVal = NULL

zou geen resultaten opleveren. Dezelfde zoekopdracht, met ANSI NULLS uitgeschakeld:

 set ansi_nulls off

 SELECT id
 FROM table
 WHERE someVal = NULL

Zou id 0 retourneren.

IS NIETS()

De functie IsNull() accepteert twee parameters en retourneert de tweede parameter als de eerste null .

parameters:

  1. controleer uitdrukking. Elke expressie van elk gegevenstype.
  2. vervangingswaarde. Dit is de waarde die wordt geretourneerd als de cheque-expressie null is. De vervangingswaarde moet van een gegevenstype zijn dat impliciet kan worden geconverteerd naar het gegevenstype van de chequexpressie.

De functie IsNull() retourneert hetzelfde gegevenstype als de chequexpressie.

DECLARE @MyInt int -- All variables are null until they are set with values.

SELECT ISNULL(@MyInt, 3) -- Returns 3.

Zie ook COALESCE , hierboven

Is null / Is niet null

Aangezien null geen waarde is, kunt u geen vergelijkingsoperatoren met nulls gebruiken.
Om te controleren of een kolom of variabele null bevat, moet je is null :

DECLARE @Date date = '2016-08-03'

De volgende instructie selecteert de waarde 6 , omdat alle vergelijkingen met null-waarden onwaar of onbekend zijn:

SELECT CASE WHEN @Date = NULL THEN 1
            WHEN @Date <> NULL THEN 2
            WHEN @Date > NULL THEN 3
            WHEN @Date < NULL THEN 4
            WHEN @Date IS NULL THEN 5
            WHEN @Date IS NOT NULL THEN 6

Stel de inhoud van de variabele @Date in op null en probeer het opnieuw. De volgende instructie retourneert 5 :

SET @Date = NULL -- Note that the '=' here is an assignment operator!

SELECT CASE WHEN @Date = NULL THEN 1
            WHEN @Date <> NULL THEN 2
            WHEN @Date > NULL THEN 3
            WHEN @Date < NULL THEN 4
            WHEN @Date IS NULL THEN 5
            WHEN @Date IS NOT NULL THEN 6

COALESCE ()

COALESCE () Evalueert de argumenten in volgorde en retourneert de huidige waarde van de eerste expressie die aanvankelijk niet wordt geëvalueerd naar NULL .

DECLARE @MyInt int -- variable is null until it is set with value.
DECLARE @MyInt2 int -- variable is null until it is set with value.
DECLARE @MyInt3 int -- variable is null until it is set with value.

SET @MyInt3  = 3

SELECT COALESCE (@MyInt, @MyInt2 ,@MyInt3 ,5) -- Returns 3 : value of @MyInt3.

Hoewel ISNULL () op dezelfde manier werkt als COALESCE (), accepteert de functie ISNULL () slechts twee parameters: één om te controleren en één om te gebruiken als de eerste parameter NULL is. Zie ook ISNULL hieronder

NULL met NOT IN SubQuery

Hoewel het verwerken niet in sub-query met null in de sub-query is, moeten we NULLS elimineren om uw verwachte resultaten te krijgen

create table #outertable (i int)
create table #innertable (i int)

insert into #outertable (i) values (1), (2),(3),(4), (5)
insert into #innertable (i) values (2), (3), (null)

select * from #outertable where i in (select i from #innertable)
--2
--3
--So far so good

select * from #outertable where i not in (select i from #innertable)
--Expectation here is to get 1,4,5 but it is not. It will get empty results because of the NULL it executes as {select * from #outertable where i not in (null)}

--To fix this 
select * from #outertable where i not in (select i from #innertable where i is not null)
--you will get expected results
--1
--4
--5

Wees voorzichtig met uw verwachte output terwijl u niet in sub-query met null handelt



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow