Szukaj…


Wprowadzenie

W SQL Server, NULL reprezentuje brakujące lub nieznane dane. Oznacza to, że NULL nie jest tak naprawdę wartością; lepiej opisać ją jako symbol zastępczy wartości. Jest to również powód, dla którego nie można porównywać wartości NULL z żadną wartością, a nawet z inną wartością NULL .

Uwagi

SQL Server zapewnia inne metody obsługi wartości zerowych, takie jak IS NULL , IS NOT NULL , ISNULL() , COALESCE() i inne.

Porównanie NULL

NULL jest szczególnym przypadkiem, jeśli chodzi o porównania.

Załóż następujące dane.

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

Z zapytaniem:

 SELECT id
 FROM table
 WHERE someVal = 1

zwróci identyfikator 1

 SELECT id
 FROM table
 WHERE someVal <> 1

zwróci identyfikator 2

 SELECT id
 FROM table
 WHERE someVal IS NULL

zwróci id 0

 SELECT id
 FROM table
 WHERE someVal IS NOT NULL

zwróci oba identyfikatory 1 i 2 .

Jeśli chcesz, aby wartości NULL były „zliczane” jako wartości w porównaniu = , <> , najpierw musisz je przekonwertować na typ danych zliczalny:

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

LUB

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

zwraca 0 i 2

Lub możesz zmienić swoje ustawienie ANSI Null .

ANSI NULLS

Z MSDN

W przyszłej wersji SQL Server ANSI_NULLS zawsze będzie WŁĄCZONY, a wszelkie aplikacje, które jawnie ustawią opcję WYŁ., Wygenerują błąd. Unikaj używania tej funkcji w nowych pracach programistycznych i planuj modyfikowanie aplikacji, które obecnie używają tej funkcji.

Ustawienie ANSI NULLS na off pozwala na porównanie = / <> wartości null.

Biorąc pod uwagę następujące dane:

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

Po włączeniu ANSI NULLS zapytanie to:

 SELECT id
 FROM table
 WHERE someVal = NULL

nie przyniosłoby żadnych rezultatów. Jednak to samo zapytanie, przy wyłączonym ANSI NULLS:

 set ansi_nulls off

 SELECT id
 FROM table
 WHERE someVal = NULL

Zwraca id 0 .

ISNULL ()

Funkcja IsNull() akceptuje dwa parametry i zwraca drugi parametr, jeśli pierwszy jest null .

Parametry:

  1. sprawdź wyrażenie. Dowolne wyrażenie dowolnego typu danych.
  2. wartość zastępcza. Jest to wartość, która zostanie zwrócona, jeśli wyrażenie kontrolne ma wartość NULL. Wartość zastępcza musi być typu danych, który można niejawnie przekonwertować na typ danych wyrażenia kontrolnego.

Funkcja IsNull() zwraca ten sam typ danych, co wyrażenie kontrolne.

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

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

Zobacz także COALESCE powyżej

Jest zerowy / Nie jest zerowy

Ponieważ wartość null nie jest wartością, nie można używać operatorów porównania z wartościami null.
Aby sprawdzić, czy kolumna lub zmienna ma wartość null, musisz użyć is null :

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

Poniższa instrukcja wybierze wartość 6 , ponieważ wszystkie porównania z wartościami null są fałszywe lub nieznane:

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

Ustawienie wartości zmiennej @Date na null i spróbuj ponownie, poniższa instrukcja zwróci 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 () Ocenia argumenty w kolejności i zwraca bieżącą wartość pierwszego wyrażenia, które początkowo nie ma wartości 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.

Chociaż ISNULL () działa podobnie do COALESCE (), funkcja ISNULL () akceptuje tylko dwa parametry - jeden do sprawdzenia, a drugi do użycia, jeśli pierwszy parametr ma wartość NULL. Zobacz także ISNULL poniżej

NULL z NOT IN SubQuery

Podczas gdy obsługa nie jest w pod-zapytaniu o wartości null w pod-zapytaniu, musimy wyeliminować NULLS, aby uzyskać oczekiwane wyniki

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

Podczas obsługi nie w pod-zapytaniu o wartości null należy zachować ostrożność przy oczekiwanych wynikach



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow