<>
ist Standard SQL-92; !=
ist das Äquivalent. Beide bewerten nach Werten, was NULL
nicht - NULL
ist ein Platzhalter, um zu sagen, dass kein Wert vorhanden ist.
Deshalb können Sie IS NULL
/ nur IS NOT NULL
als Prädikate für solche Situationen verwenden.
Dieses Verhalten ist nicht spezifisch für SQL Server. Alle standardkonformen SQL-Dialekte funktionieren auf die gleiche Weise.
Hinweis : Zum Vergleichen, wenn Ihr Wert nicht null ist , verwenden Sie IS NOT NULL
, während Sie zum Vergleichen mit dem Wert nicht null verwenden <> 'YOUR_VALUE'
. Ich kann nicht sagen, ob mein Wert gleich oder nicht gleich NULL ist, aber ich kann sagen, ob mein Wert NULL oder NICHT NULL ist. Ich kann vergleichen, ob mein Wert etwas anderes als NULL ist.
<>
dass es in der 92-Spezifikation ist, aber die meisten Anbieter unterstützen!=
und / oder es ist in einer späteren Spezifikation wie 99 oder 03 enthalten.!=
wie ich verstehe, bis ~ 9i nicht unterstützt , was eine Menge ANSI-92-Syntax mit sich brachte. Meiner Meinung nach ist MySQL ähnlich und startet die Unterstützung in 4.x.!=
dies in einer späteren Spezifikation als Alternative zu enthalten sein könnte<>
. Ich habe keine neuen Spezifikationen in den Händen, daher kann ich nicht sicher sagen.WHERE MyColumn != NULL
oderWHERE MyColumn = NULL
deterministisch? Oder wird mit anderen Worten garantiert immer 0 Zeilen zurückgegeben, unabhängig davon, ob sieMyColumn
in der Datenbank nullwertfähig sind oder nicht?!=
nur Werte ausgewertet werden,WHERE MyColumn != 'somevalue'
die NULL-Datensätze nicht zurückgegeben werden.NULL hat keinen Wert und kann daher nicht mit den Skalarwertoperatoren verglichen werden.
Mit anderen Worten, kein Wert kann jemals gleich (oder ungleich) NULL sein, da NULL keinen Wert hat.
Daher hat SQL spezielle IS NULL- und IS NOT NULL-Prädikate für den Umgang mit NULL.
quelle
'a' != null
KEINEN Wert (true
/1
) zurückzugeben, und mich von Zeit zu Zeit erwischt! Ich hätte gedacht, "ein Wert im Vergleich zu keinem Wert" wäre immer "nicht gleich", aber vielleicht bin das nur ich?!?SELECT * FROM MyTable WHERE coalesce(MyColumn, 'x') <> 'x'
normalerweise eine Konstante zuweisen, wenn es sich um einen NULL-Wert handelt, vorausgesetzt, Sie geben einen geeigneten Datentyp für den Sentinel-Wert x an (in diesem Fall eine Zeichenfolge / ein Zeichen). Dies ist die TSQL-Syntax, aber Oracle und andere Engines verfügen über ähnliche Funktionen.Beachten Sie, dass dieses Verhalten das Standardverhalten (ANSI) ist.
Wenn du:
http://msdn.microsoft.com/en-us/library/ms188048.aspx
Sie erhalten unterschiedliche Ergebnisse.
SET ANSI_NULLS OFF
wird anscheinend in Zukunft weggehen ...quelle
create unique index UK_MyTable on MyTable (Column) where Column is not null
): msdn.microsoft.com/en-us/library/cc280372.aspxSET ANSI_NULLS
AUS ist, folgen die Vergleichsoperatoren Equals (=) und Not Equal To (<>) nicht dem ISO-Standard. Eine verwendete SELECT-AnweisungWHERE column_name = NULL
gibt die Zeilen zurück, deren Spaltenname Nullwerte enthält. Eine verwendete SELECT-AnweisungWHERE column_name <> NULL
gibt die Zeilen zurück, deren Spalte nicht null Werte enthält. Außerdem gibt eine verwendete SELECT-AnweisungWHERE column_name <> XYZ_value
alle Zeilen zurück, die nicht XYZ_value und nicht NULL sind. IMHO, diese letzte Aussage scheint ein wenig seltsam, da sie Nullen aus den Ergebnissen ausschließt!In SQL alles, was Sie mit
NULL
Ergebnissen in UNBEKANNT auswerten / berechnenDies ist der Grund
SELECT * FROM MyTable WHERE MyColumn != NULL
oderSELECT * FROM MyTable WHERE MyColumn <> NULL
gibt Ihnen 0 Ergebnisse.Zur Überprüfung der
NULL
Werte wird die Funktion isNull bereitgestellt.Darüber hinaus können Sie den
IS
Operator wie in der dritten Abfrage verwenden.Hoffe das hilft.
quelle
Der einzige Test für NULL ist IS NULL oder IS NOT NULL. Das Testen auf Gleichheit ist unsinnig, da man per Definition nicht weiß, was der Wert ist.
Hier ist ein Wikipedia-Artikel zu lesen:
https://en.wikipedia.org/wiki/Null_(SQL)
quelle
Wir gebrauchen
um alle Zeilen zurückzugeben, in denen MyColumn NULL ist, oder alle Zeilen, in denen MyColumn eine leere Zeichenfolge ist. Für viele "Endbenutzer" ist das Problem NULL vs. leere Zeichenfolge eine Unterscheidung ohne Notwendigkeit und Verwirrung.
quelle
Ich sehe nur nicht den funktionalen und nahtlosen Grund dafür, dass Nullen nicht mit anderen Werten oder anderen Nullen vergleichbar sind, weil wir sie klar vergleichen und sagen können, dass sie in unserem Kontext gleich sind oder nicht. Es ist lustig. Nur wegen einiger logischer Schlussfolgerungen und Beständigkeit müssen wir uns ständig damit beschäftigen. Es ist nicht funktional, macht es funktionaler und überlässt es Philosophen und Wissenschaftlern, zu schließen, ob es konsistent ist oder nicht, und enthält es "universelle Logik". :) Jemand könnte sagen, dass es an Indizes oder etwas anderem liegt. Ich bezweifle, dass diese Dinge nicht dazu gebracht werden konnten, Nullen wie Werte zu unterstützen. Es ist dasselbe wie zwei leere Gläser zu vergleichen, eines ist Weinglas und das andere ist Bierglas. Wir vergleichen nicht die Arten von Objekten, sondern die darin enthaltenen Werte, so wie Sie int und varchar mit null it vergleichen könnten. ' s noch einfacher, es ist nichts und was zwei Nichts gemeinsam haben, sie sind gleich, eindeutig vergleichbar von mir und allen anderen, die SQL schreiben, weil wir diese Logik ständig brechen, indem wir sie aufgrund einiger ANSI-Standards auf seltsame Weise vergleichen. Warum nicht Computerleistung verwenden, um dies für uns zu tun, und ich bezweifle, dass dies die Dinge verlangsamen würde, wenn alles, was damit zusammenhängt, in diesem Sinne konstruiert wird. "Es ist nicht null, es ist nichts", es ist nicht Apfel, es ist Apfel, komm schon ... Funktionell ist dein Freund und hier gibt es auch Logik. Am Ende kommt es nur auf die Funktionalität an, und die Verwendung von Nullen auf diese Weise bringt mehr oder weniger Funktionalität und Benutzerfreundlichkeit. Ist es nützlicher? weil wir diese Logik ständig brechen, indem wir sie aufgrund einiger ANSI-Standards auf seltsame Weise vergleichen. Warum nicht Computerleistung verwenden, um dies für uns zu tun, und ich bezweifle, dass dies die Dinge verlangsamen würde, wenn alles, was damit zusammenhängt, in diesem Sinne konstruiert wird. "Es ist nicht null, es ist nichts", es ist nicht Apfel, es ist Apfel, komm schon ... Funktionell ist dein Freund und hier gibt es auch Logik. Am Ende kommt es nur auf die Funktionalität an, und die Verwendung von Nullen auf diese Weise bringt mehr oder weniger Funktionalität und Benutzerfreundlichkeit. Ist es nützlicher? weil wir diese Logik ständig brechen, indem wir sie aufgrund einiger ANSI-Standards auf seltsame Weise vergleichen. Warum nicht Computerleistung verwenden, um dies für uns zu tun, und ich bezweifle, dass dies die Dinge verlangsamen würde, wenn alles, was damit zusammenhängt, in diesem Sinne konstruiert wird. "Es ist nicht null, es ist nichts", es ist nicht Apfel, es ist Apfel, komm schon ... Funktionell ist dein Freund und hier gibt es auch Logik. Am Ende kommt es nur auf die Funktionalität an, und die Verwendung von Nullen auf diese Weise bringt mehr oder weniger Funktionalität und Benutzerfreundlichkeit. Ist es nützlicher? s nicht Apfel, es ist Apfel, komm schon ... Funktionell ist dein Freund und hier gibt es auch Logik. Am Ende kommt es nur auf die Funktionalität an, und die Verwendung von Nullen auf diese Weise bringt mehr oder weniger Funktionalität und Benutzerfreundlichkeit. Ist es nützlicher? s nicht Apfel, es ist Apfel, komm schon ... Funktionell ist dein Freund und hier gibt es auch Logik. Am Ende kommt es nur auf die Funktionalität an, und die Verwendung von Nullen auf diese Weise bringt mehr oder weniger Funktionalität und Benutzerfreundlichkeit. Ist es nützlicher?
Betrachten Sie diesen Code:
Wie viele von Ihnen wissen, was dieser Code zurückgibt? Mit oder ohne NICHT gibt es 0 zurück. Für mich ist das nicht funktionsfähig und verwirrend. In c # ist alles so, wie es sein sollte, Vergleichsoperationen geben einen Wert zurück, logischerweise erzeugt auch dies einen Wert, denn wenn dies nicht der Fall ist, gibt es nichts zu vergleichen (außer nichts :)). Sie haben nur "gesagt": Alles im Vergleich zu null "gibt" 0 zurück und das schafft viele Problemumgehungen und Kopfschmerzen.
Dies ist der Code, der mich hierher gebracht hat:
Ich muss nur vergleichen, ob zwei Felder (in wo) unterschiedliche Werte haben, ich könnte Funktion verwenden, aber ...
quelle
NULL Mit den Vergleichsoperatoren kann kein Wert verglichen werden. NULL = NULL ist falsch. Null ist kein Wert. Der IS-Operator wurde speziell für NULL-Vergleiche entwickelt.
quelle
null = null
wo man es1=0
in einer Ad-hoc-Abfrage verwenden könnte. Und wenn sie sich beschweren, ändere ich es aufnull != null
:)Alte Frage, aber die folgende könnte einige Details bieten.
null
repräsentiert keinen Wert oder einen unbekannten Wert. Es wird nicht angegeben, warum kein Wert vorhanden ist, was zu Mehrdeutigkeiten führen kann.Angenommen, Sie führen eine Abfrage wie folgt aus:
Das heißt, Sie suchen nach Zeilen, in denen Datum
ordered
unddelivered
Datum identisch sind.Was ist zu erwarten, wenn eine oder beide Spalten null sind?
Da mindestens eines der Daten unbekannt ist, können Sie nicht erwarten, dass die beiden Daten identisch sind. Dies ist auch dann der Fall, wenn beide Daten unbekannt sind: Wie können sie gleich sein, wenn wir nicht einmal wissen, was sie sind?
Aus diesem Grund muss jeder Ausdruck, der
null
als Wert behandelt wird, fehlschlagen. In diesem Fall stimmt es nicht überein. Dies ist auch der Fall, wenn Sie Folgendes versuchen:Wie können wir wieder sagen, dass zwei Werte nicht gleich sind, wenn wir nicht wissen, was sie sind?
SQL hat einen speziellen Test für fehlende Werte:
Insbesondere werden keine Werte verglichen , sondern fehlende Werte gesucht.
Was den
!=
Betreiber betrifft , so ist er meines Wissens in keinem der Standards enthalten, wird aber sehr weitestgehend unterstützt. Es wurde hinzugefügt, damit sich Programmierer aus einigen Sprachen wie zu Hause fühlen. Ehrlich gesagt, wenn ein Programmierer Schwierigkeiten hat, sich daran zu erinnern, welche Sprache er verwendet, hat er einen schlechten Start.quelle
NULL
, meinen, dass wir einen Wert mit "einenNULL
Wert haben" vergleichen, nicht den Wert mit "dem unbestimmten Wert, den die UnterlageNULL
hat", aber dass wir es nicht wissen ", was wir natürlich nie erfahren werden. Das würde die Dinge wirklich erleichtern.IS NULL
viel schwieriger ist als das Schreiben= NULL
. Ich denke, es wäre konsequenter, wennWHERE columnA = columnB
es die gleiche Interpretation wie hätteWHERE columnA = NULL
, anstatt letzteres als Sonderfall zu behandeln. Denken Sie daran , dassNULL
ist nicht ein Wert. In Programmiersprachen , wo es ist legitim zu testen ,variable == null
ist es, weilnull
eine andere Bedeutung hat; es stellt nichts Unbekanntes dar, sondern ein absichtliches Zurücksetzen eines Wertes. Nicht so bei SQL.IS NULL
UND=NULL
in Ihrem neuesten Beispiel kein Overhead besteht . Aber schauen Sie sich Hovers letzten an. Ich bin es leid, es immer wieder zu erleben und eine Menge unnötiger Dinge tun zu müssen? zusätzliche Überprüfung ...Ich möchte diesen Code vorschlagen, den ich erstellt habe, um festzustellen, ob sich ein Wert ändert,
i
der neue Wert undd
der alte (obwohl die Reihenfolge keine Rolle spielt). Im Übrigen ist eine Änderung von Wert zu Null oder umgekehrt eine Änderung, von Null zu Null jedoch nicht (natürlich ist eine Änderung von Wert zu einem anderen Wert eine Änderung, von Wert zu demselben jedoch nicht).Um diese Funktion zu verwenden, können Sie
Die Ergebnisse sind:
Die Verwendung von sql_variant macht es für verschiedene Typen kompatibel
quelle
NULL ist nichts ... es ist unbekannt. NULL ist nichts gleich. Aus diesem Grund müssen Sie in Ihren SQL-Abfragen die magische Phrase IS NULL anstelle von = NULL verwenden
Sie können dies verweisen: http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx
quelle