Microsoft SQL Server
NULL
Suche…
Einführung
In SQL Server steht NULL
für fehlende oder unbekannte Daten. Dies bedeutet, dass NULL
nicht wirklich ein Wert ist. Es ist besser als Platzhalter für einen Wert beschrieben. Dies ist auch der Grund, warum Sie NULL
mit keinem Wert und nicht einmal mit einem anderen NULL
.
Bemerkungen
SQL Server bietet andere Methoden zum Behandeln von Nullwerten, z. B. IS NULL
, IS NOT NULL
, ISNULL()
, COALESCE()
und andere.
NULL-Vergleich
NULL
ist ein Sonderfall, wenn es um Vergleiche geht.
Nehmen Sie die folgenden Daten an.
id someVal
----
0 NULL
1 1
2 2
Mit einer Abfrage:
SELECT id
FROM table
WHERE someVal = 1
würde id 1
SELECT id
FROM table
WHERE someVal <> 1
würde id 2
SELECT id
FROM table
WHERE someVal IS NULL
würde id 0
SELECT id
FROM table
WHERE someVal IS NOT NULL
würde beide IDs 1
und 2
.
Wenn Sie möchten, dass NULL-Werte als Werte in einem Vergleich von =
, <>
"gezählt" werden, muss dieser zunächst in einen abzählbaren Datentyp konvertiert werden:
SELECT id
FROM table
WHERE ISNULL(someVal, -1) <> 1
ODER
SELECT id
FROM table
WHERE someVal IS NULL OR someVal <> 1
gibt 0
und 2
Oder Sie können Ihre ANSI-Null- Einstellung ändern.
ANSI-NULLEN
Von MSDN
In einer zukünftigen Version von SQL Server ist ANSI_NULLS immer ON, und alle Anwendungen, die die Option explizit auf OFF setzen, erzeugen einen Fehler. Vermeiden Sie die Verwendung dieser Funktion in neuen Entwicklungsarbeiten und planen Sie, Anwendungen zu ändern, die diese Funktion derzeit verwenden.
ANSI NULLS
auf off gesetzt ist, können ANSI NULLS
zwischen =
/ <>
verglichen werden.
Angesichts der folgenden Daten:
id someVal
----
0 NULL
1 1
2 2
Und mit ANSI NULLS an, diese Abfrage:
SELECT id
FROM table
WHERE someVal = NULL
würde keine Ergebnisse produzieren. Jedoch die gleiche Abfrage mit ANSI NULLS aus:
set ansi_nulls off
SELECT id
FROM table
WHERE someVal = NULL
Würde id 0
.
IST NULL()
Die IsNull()
Funktion akzeptiert zwei Parameter und gibt den zweiten Parameter zurück, wenn der erste null
.
Parameter:
- überprüfe den Ausdruck. Jeder Ausdruck eines beliebigen Datentyps.
- Wiederbeschaffungswert. Dies ist der Wert, der zurückgegeben würde, wenn der Prüfausdruck null ist. Der Ersetzungswert muss von einem Datentyp sein, der implizit in den Datentyp des Prüfausdrucks konvertiert werden kann.
Die IsNull()
Funktion gibt denselben Datentyp wie der IsNull()
zurück.
DECLARE @MyInt int -- All variables are null until they are set with values.
SELECT ISNULL(@MyInt, 3) -- Returns 3.
Siehe auch COALESCE
oben
Ist null / ist nicht null
Da null kein Wert ist, können Sie keine Vergleichsoperatoren mit Nullwerten verwenden.
Um zu überprüfen, ob eine Spalte oder Variable null enthält, müssen Sie is null
:
DECLARE @Date date = '2016-08-03'
Die folgende Anweisung wählt den Wert 6
, da alle Vergleiche mit Nullwerten als falsch oder unbekannt ausgewertet werden:
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
Wenn Sie den Inhalt der @Date-Variablen auf null
und erneut versuchen, gibt die folgende Anweisung 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 ()
Wertet die Argumente in der Reihenfolge aus und gibt den aktuellen Wert des ersten Ausdrucks zurück, der anfangs nicht 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.
Obwohl ISNULL () ähnlich wie COALESCE () arbeitet, akzeptiert die Funktion ISNULL () nur zwei Parameter - einen zu überprüfenden Parameter und einen, wenn der erste Parameter NULL ist. Siehe auch ISNULL
unten
NULL mit NOT IN SubQuery
Bei der Bearbeitung in einer Unterabfrage mit Null in der Unterabfrage müssen wir NULLS entfernen, um die erwarteten Ergebnisse zu erhalten
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
Seien Sie bei der Bearbeitung nicht in einer Unterabfrage mit null vorsichtig mit Ihrer erwarteten Ausgabe