Microsoft SQL Server
NULL
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:
- controleer uitdrukking. Elke expressie van elk gegevenstype.
- 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