Suchbedingungen mit NULL-Vergleichen
Der Wert NULL bedeutet, dass der Datenwert für die Spalte unbekannt oder nicht verfügbar ist. NULL ist kein Synonym für Null (den numerischen oder binären Wert 0), für eine Zeichenfolge der Länge null oder für ein leeres Zeichen (einen Zeichenwert). Vielmehr können Sie anhand von NULL-Werten unterscheiden, ob eine 0 (bei numerischen Spalten) oder ein leeres Zeichen (bei Zeichenspalten) eingetragen wurde oder ob kein Eintrag vorliegt (in diesem Fall liegt sowohl in numerischen Spalten als auch in Zeichenspalten der Wert NULL vor).
NULL kann in eine Spalte, für die NULL-Werte zulässig sind (dies wird in der CREATE TABLE-Anweisung angegeben), auf zwei Arten eingegeben werden:
SQL Server verwendet automatisch den Wert NULL, wenn keine Daten eingegeben werden und weder ein Standardwert noch eine DEFAULT-Einschränkung für die Spalte oder den Datentyp vorliegt.
Der Benutzer kann den Wert NULL explizit eingeben; hierzu gibt er NULL ohne Anführungszeichen ein. Wenn das Wort NULL mit Anführungszeichen in eine Zeichenspalte eingegeben wird, wird es nicht als NULL-Wert interpretiert, sondern als Buchstabenfolge N, U, L und L.
Wenn NULL-Werte abgerufen werden, zeigt eine Anwendung in der Regel eine Zeichenfolge, z. B. NULL oder (NULL) oder (null), an der entsprechenden Position an. In der Color-Spalte der Product-Tabelle sind NULL-Werte beispielsweise zulässig:
USE AdventureWorks2008R2;
GO
SELECT ProductID, Name, Color
FROM AdventureWorks2008R2.Production.Product
WHERE Color IS NULL
Vergleichen von NULL-Werten
Beim Vergleichen von NULL-Werten sollten Sie mit Sorgfalt vorgehen. Das Verhalten des Vergleichs hängt von der Einstellung der Option SET ANSI_NULLS ab.
Ist die Option SET ANSI_NULLS auf ON festgelegt, wird bei einem Vergleich mit einem oder mehreren NULL-Ausdrücken nicht TRUE oder FALSE zurückgegeben, sondern UNKNOWN. Der Grund hierfür ist, dass ein unbekannter Wert mit einem anderen Wert logisch nicht verglichen werden kann. Dies ist der Fall, wenn ein Ausdruck mit dem Literal NULL verglichen wird oder wenn zwei Ausdrücke verglichen werden, von denen einer zu NULL ausgewertet wird. Der folgende Vergleich gibt z. B. immer UNKNOWN zurück, wenn ANSI_NULLS auf ON festgelegt ist:
ytd_sales > NULL
Auch der folgende Vergleich gibt immer UNKNOWN zurück, wenn die Variable den Wert NULL enthält:
ytd_sales > @MyVariable
Verwenden Sie die Klauseln IS NULL oder IS NOT NULL, um zu überprüfen, ob ein NULL-Wert vorliegt. Dadurch nimmt die Komplexität der WHERE-Klausel möglicherweise zu. In der TerritoryID-Spalte in der AdventureWorks2008R2Customer-Tabelle sind NULL-Werte beispielsweise zulässig: Soll eine SELECT-Anweisung u. a. das Vorhandensein von NULL-Werten überprüfen, muss eine IS NULL-Klausel eingefügt werden:
SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
OR TerritoryID IS NULL
Transact-SQL unterstützt eine Erweiterung, die es ermöglicht, dass die Vergleichsoperatoren beim Vergleich mit NULL-Werten TRUE oder FALSE zurückgeben. Diese Option wird durch Festlegen der Option ANSI_NULLS auf OFF aktiviert. Ist ANSI_NULLS auf OFF festgelegt, geben Vergleiche wie ColumnA = NULL den Wert TRUE zurück, wenn ColumnA einen NULL-Wert enthält und den Wert FALSE, wenn ColumnA neben NULL einen weiteren Wert enthält. Auch der Vergleich von zwei Ausdrücken, die NULL ergeben, gibt den Wert TRUE zurück. Die ANSI_NULLS-Einstellung wirkt sich nicht auf verknüpfte Spalten aus, die einen NULL-Wert enthalten. Zeilen in verknüpften Spalten, die einen NULL-Wert enthalten, sind kein Teil des Resultsets. Wenn ANSI_NULLS auf OFF festgelegt ist, gibt folgende SELECT-Anweisung alle Zeilen der Customer-Tabelle zurück, für die Region einem NULL-Wert entspricht:
SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID = NULL
Unabhängig von der Einstellung der Option ANSI_NULLS werden NULL-Werte im Zusammenhang mit den ORDER BY-, GROUP BY- und DISTINCT-Schlüsselwörtern immer als identisch angesehen. Darüber hinaus kann ein eindeutiger Index oder eine UNIQUE-Einschränkung, für die NULL zulässig ist, nur eine einzige Zeile mit einem NULL-Schlüsselwert enthalten. Eine weitere Zeile mit NULL wird nicht akzeptiert. Spalten, die Bestandteil eines Primärschlüssels sind, dürfen keine NULL-Werte enthalten.
Berechnungen mit NULL-Werten werden zu NULL ausgewertet, da das Ergebnis UNKNOWN sein muss, wenn einer der Faktoren unbekannt ist. Beispielsweise wird column1 + 1 zu NULL ausgewertet, wenn column1 NULL ist.
Wenn einige der zu durchsuchenden Spalten NULL-Werte zulassen, können Sie NULL-Werte oder Nicht-NULL-Werte in der Datenbank nach folgendem Muster ermitteln:
WHERE column_name IS [NOT] NULL