Microsoft SQL Server
NULLs
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:
- sprawdź wyrażenie. Dowolne wyrażenie dowolnego typu danych.
- 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