Warum ist null ungleich null false?
War ich der Lektüre dieses Artikels:
Erhalten null == null in SQL
Und der Konsens ist, dass, wenn Sie versuchen zu testen Gleichheit zwischen zwei (nullable) sql-Spalten, der richtige Ansatz ist:
where ((A=B) OR (A IS NULL AND B IS NULL))
Wenn A und B NULL sind, (A=B) noch gibt FALSE zurück, da NULL nicht gleich NULL. Deshalb ist die zusätzliche überprüfung erforderlich ist.
Was beim testen von Ungleichheiten? Aus der obigen Diskussion, es machte mich denken, dass zu testen Ungleichheit, die ich brauchen würde, um etwas zu tun wie:
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Allerdings habe ich gemerkt, dass das nicht nötig ist (zumindest nicht auf informix 11.5), und ich kann das einfach tun:
where (A<>B)
Wenn A und B NULL ist, gibt diese Methode FALSE zurück. Wenn der Wert NULL ist nicht gleich NULL, dann sollte dies nicht TRUE zurückgeben?
BEARBEITEN
Dies sind alles gute Antworten, aber ich denke, meine Frage war ein wenig vage. Lassen Sie mich anders formulieren:
Gegeben, dass entweder A oder B NULL sein kann, ist es genug, um zu überprüfen, Ihre Ungleichheit mit
where (A<>B)
Oder muss ich explizit überprüfen Sie es wie folgt:
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
FINDEN Sie auf dieser thread für die Antwort auf diese Frage.
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
relationale Ausdrücke mit NULL-Ausbeute eigentlich NULL wieder
Bearbeiten
hier
<>
steht für beliebigen binären operatorNULL
ist die SQL-Platzhalter, undvalue
ist ein beliebiger Wert (NULL
ist nicht Wert):NULL <> value
->NULL
NULL <> NULL
->NULL
die Logik ist:
NULL
bedeutet "kein Wert" oder "unbekannter Wert" und damit den Vergleich mit tatsächlichen Wert keinen Sinn macht.ist
X = 42
wahr, falsch oder unbekannt, da Sie nicht wissen, was Wert (wenn alle)X
hält? SQL sagt, es ist unbekannt. istX = Y
wahr, falsch oder unbekannt ist, gegeben, dass beide unbekannt sind? SQL sagt, das Ergebnis ist unbekannt. und es sagt so für binäre relationale operation, ist nur logisch (auch wenn Null-Werte in das Modell ist nicht in Erster Linie).SQL bietet auch zwei unäre postfix-Operatoren,
IS NULL
undIS NOT NULL
diese TRUE oder FALSE zurückgeben nach Ihrem Operanden.NULL IS NULL
->TRUE
NULL IS NOT NULL
->FALSE
InformationsquelleAutor der Antwort just somebody
Weil das Verhalten folgt aufgebaut ternäre Logik wo die NULL ist, als einen unbekannten Wert.
Wenn Sie denken, Sie NULL als unbekannt, es wird viel mehr intuitiv:
Ist
unknown a
gleichunknown b
? Es gibt keine Möglichkeit zu wissen, so:unknown
.InformationsquelleAutor der Antwort Ben S
Alle Vergleiche mit
null
undefiniert sind, und zu false ausgewertet. Diese Idee, die ist, was verhindert, dassnull
bewertet werden als äquivalent zunull
auch verhindert, dassnull
bewertet werden als NICHT gleichwertig zunull
.InformationsquelleAutor der Antwort Adam Robinson
Die kurze Antwort ist... Null-Werte sind komischdie Sie eigentlich gar nicht Verhalten, wie man erwarten würde.
Hier ist eine große Papier auf, wie Null-Werte in SQL. Ich denke, es wird helfen, verbessern Sie Ihr Verständnis für das Thema. Ich denke, die Abschnitte über den Umgang mit null-Werte in Ausdrücken wird besonders nützlich sein für Sie.
http://www.oracle.com/technology/oramag/oracle/05-jul/o45sql.html
InformationsquelleAutor der Antwort Robert Greiner
Den Standard (ANSI) Verhalten von null-Werten innerhalb eines Ausdrucks wird im Ergebnis eine null (es gibt genug andere Antworten mit den Fällen).
Allerdings gibt es einige Sonderfälle und Einschränkungen, dass würde ich beim Umgang mit dem MS-Sql-Server, sind nicht aufgelistet.
Ist es möglich, in SQL Server das überschreiben der Ausdruck Logik in Bezug auf die spezifischen Null = Null-test, der mit SET ANSI_NULLS OFF, welches dann geben Sie die Gleichstellung von null-Werten - dies ist nicht eine empfohlene bewegen, aber nicht vorhanden.
InformationsquelleAutor der Antwort Andrew
Hier ist eine Schnelle Lösung
ISNULL(A,0)=ISNULL(B,0)
0 kann geändert werden, um etwas, das nie passieren kann in deinen Daten
InformationsquelleAutor der Antwort
"Ist unbekannt, eine gleich unbekannt b? Es gibt keine Möglichkeit zu wissen, also: unbekannt".
Die Frage war : warum ist der Vergleich Rendite FALSCH ?
Drei-wertige Logik, es wäre in der Tat sinnvoll für den Vergleich der Ausbeute UNBEKANNT (nicht FALSE). Aber SQL Ertrag FALSCHEN, und auch nicht UNBEKANNT.
Einer der Myriaden von Ungeheuerlichkeiten, die in der SQL-Sprache.
Darüber hinaus muss Folgendes berücksichtigt werden :
Wenn "unbekannt" ist ein logischer Wert in einem ternären Logik, dann müsste es doch der Fall sein, dass ein Geschlechter-Vergleich zwischen zwei logische Werte, die sowohl zufällig (der Wert), "unbekannt", dann ist der Vergleich sollte die Ausbeute STIMMT.
Wenn der logische Wert selbst ist nicht bekannt, so ist offensichtlich, dass nicht dargestellt werden kann, indem der Wert "unbekannt" gibt, denn das würde bedeuten, dass der logische Wert bekannt ist ("unbekannt"). Das ist, ein.o., wie relationale Theorie beweist, dass die Implementierung von 3-wertige Logik stellt sich die Anforderung für eine 4-wertige Logik, dass ein 4-valued logic führt zu der Notwendigkeit für ein 5-valued logic, etc. etc. ad infinitum.
InformationsquelleAutor der Antwort