SQL-Und NULL-Werten in where-Klausel
Also ich habe eine einfache Abfrage gibt eine Auflistung der Produkte
SELECT Model, CategoryID
FROM Products
WHERE (Model = '010-00749-01')
Diese gibt
010-00749-01 00000000-0000-0000-0000-000000000000
010-00749-01 NULL
Korrekt ist, so wollte ich nur die Produkte, deren Kategorie-id ist nicht '00000000-0000-0000-0000-000000000000', so habe ich
SELECT Model, CategoryID
FROM Products
WHERE (Model = '010-00749-01')
AND (CategoryID <> '00000000-0000-0000-0000-000000000000')
Aber diese kein Ergebnis zurück. Also änderte ich die Abfrage
SELECT Model, CategoryID
FROM Products
WHERE (Model = '010-00749-01')
AND ((CategoryID <> '00000000-0000-0000-0000-000000000000') OR (CategoryID IS NULL))
Gibt das erwartete Ergebnis
010-00749-01 NULL
Kann mir jemand erklären, dies Verhalten zu mir?
MS SQL Server 2008
- der wiki Artikel ist ziemlich gut erklärt, NULL - en.wikipedia.org/wiki/Null_%28SQL%29
- Cam - man sollte gepostet habe das als Antwort...
- Ich fühlte, es war mehr ein lmgtfy Antwort 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schauen Sie sich die vollständige Referenz auf Bücher Online - standardmäßig ist ANSI_NULLS auf on festgelegt ist heißt, Sie müssten verwenden Sie die Methode, die Sie getan haben. Ansonsten könnte man wechseln, die Einstellung OFF beim start der Abfrage zu wechseln, das Verhalten Runde.
Hier ein einfaches Beispiel um zu demonstrieren, das Verhalten hinsichtlich der Vergleiche gegen NULL:
off
verringern die Leistung und erhöhen die logische Lesevorgänge. Drehen Sie es auf, wirkt sich auf die Abfrage-plan.Coalesce
ist eine bessere Lösung. Als ich erklärt habe, wenn Sie sind besorgt über die Auswirkungen auf die Leistung, dann index, der Bereich w/ der Funktion, sonst sauber, die zugrunde liegenden Daten.IS NULL
oderIS NOT NULL
syntax.Im Allgemeinen, Sie haben sich daran zu erinnern, dass die NULL bedeutet in der Regel UNBEKANNT. Das heißt, wenn Sie sagen
CategoryID <> '00000000-0000-0000-0000-000000000000'
man davon ausgehen, dass die Abfrage nur die Werte zurückgeben, dass es bekannt wird, die Ihren Kriterien entsprechen. Da gibt es eine NULL (UNKNOWN) Ergebnis es eigentlich nicht wissen, ob Sie diesen Datensatz erfüllt Ihre Kriterien und wird daher nicht zurückgegeben werden, die in das dataset.schau mal hier:
false
oderunknown
, es ist eigentlich egal, denn die Zeile wird nicht in die Ergebnismenge aufgenommen, was die Frage war.Grundsätzlich eine NULL ist die fehlen jeglicher Wert. So versuchen zu vergleichen, die NULL in CategoryId zu einem varchar-Wert in der Abfrage wird immer eine falsche Bewertung.
Möchten Sie vielleicht zu versuchen, mit der COALESCE-Funktion, so etwas wie:
BEARBEITEN
Wie bereits von
AdaTheDev
die COALESCE-Funktion zu negieren alle Indizes, die eventuell auf der CategoryID-Spalte, die Einfluss auf die Abfrage-plan und performance.Null bekommt eine Besondere Behandlung. Sie müssen explizit auf null zu testen. Sehen http://msdn.microsoft.com/en-us/library/ms188795.aspx
Können Sie versuchen, mithilfe der
Coalesce
- Funktion, um einen Standardwert für die Felder, für dienull
:Ich denke, das problem liegt in deinem Verständnis von
NULL
was im Grunde bedeutet "nichts". Man kann nicht alles vergleichen zu nichts, viel, wie Sie können nicht teilen eine Zahl durch 0. Es ist nur die Regeln der Mathematik/Wissenschaft.Edit:
Als Ada hat darauf hingewiesen, dies könnte zu einem indizierten Feld nicht mehr einen index verwenden.
Lösung:
create index ... coalesce(field)
not null
Einschränkung um zu verhindern, dass Null-Werte von je erscheinencoalesce(field)
oder hinzufügen einer not null-Einschränkung um zu verhindern, dass Null-Werte von je erscheinen. Eine de-facto-standard ist es mir auch, immer weisen Sie Standardwerte und nie die null-Werte zulassen.