Sök…


Introduktion

I SQL Server representerar NULL data som saknas eller är okänd. Detta betyder att NULL inte riktigt är ett värde; det beskrivs bättre som en platshållare för ett värde. Detta är också anledningen till att du inte kan jämföra NULL med något värde och inte ens med en annan NULL .

Anmärkningar

SQL Server tillhandahåller andra metoder för att hantera nollor, som IS NULL , IS NOT NULL , ISNULL() , COALESCE() och andra.

NULL jämförelse

NULL är ett speciellt fall när det gäller jämförelser.

Antag följande data.

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

Med en fråga:

 SELECT id
 FROM table
 WHERE someVal = 1

skulle returnera id 1

 SELECT id
 FROM table
 WHERE someVal <> 1

skulle returnera id 2

 SELECT id
 FROM table
 WHERE someVal IS NULL

skulle returnera id 0

 SELECT id
 FROM table
 WHERE someVal IS NOT NULL

skulle returnera både ID 1 och 2 .

Om du ville att NULL ska "räknas" som värden i en = , <> jämförelse måste den först konverteras till en räknbar datatyp:

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

ELLER

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

returnerar 0 och 2

Eller så kan du ändra din ANSI Null- inställning.

ANSI NULLS

Från MSDN

I en framtida version av SQL Server kommer ANSI_NULLS alltid att vara PÅ och alla program som uttryckligen ställer in alternativet till AV kommer att generera ett fel. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra applikationer som för närvarande använder den här funktionen.

ANSI NULLS som stängs av möjliggör en = / <> jämförelse av nollvärden.

Följande data:

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

Och med ANSI NULLS på denna fråga:

 SELECT id
 FROM table
 WHERE someVal = NULL

skulle inte ge några resultat. Men samma fråga, med ANSI NULLS av:

 set ansi_nulls off

 SELECT id
 FROM table
 WHERE someVal = NULL

Skulle returnera id 0 .

ÄR INGET()

IsNull() accepterar två parametrar och returnerar den andra parametern om den första är null .

parametrar:

  1. kontrollera uttryck. Alla uttryck av vilken datatyp som helst.
  2. Ersättningsvärde. Detta är värdet som skulle returneras om checkuttrycket är noll. Ersättningsvärdet måste vara av en datatyp som implicit kan konverteras till datatypen för kontrolluttrycket.

IsNull() returnerar samma datatyp som kontrolluttrycket.

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

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

Se även COALESCE ovan

Är noll / Är inte noll

Eftersom null inte är ett värde, kan du inte använda jämförelseoperatörer med noll.
För att kontrollera om en kolumn eller variabel har noll måste du använda is null :

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

Följande påstående väljer värdet 6 , eftersom alla jämförelser med nollvärden utvärderas till falskt eller okänt:

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

Om du ställer in innehållet i @Date-variabeln till null och försöker igen kommer följande uttalande att returnera 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 () Utvärderar argumenten i ordning och returnerar det aktuella värdet för det första uttrycket som initialt inte utvärderar till 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.

Även om ISNULL () fungerar på samma sätt som COALESCE () accepterar ISNULL () -funktionen bara två parametrar - en för att kontrollera och en som ska användas om den första parametern är NULL. Se även ISNULL nedan

NULL med INTE I SubQuery

Samtidigt som vi inte hanterar en subfråga med noll i undernfrågan måste vi eliminera NULLS för att få dina förväntade resultat

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

Var försiktig med din förväntade produktion medan du inte hanterar en subfråga med noll



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow