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:

  1. überprüfe den Ausdruck. Jeder Ausdruck eines beliebigen Datentyps.
  2. 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



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow