Wie kann die SQL "IST" und "=" Operatoren unterscheiden?
Baue ich einige Anweisungen vorbereitet, dass die Nutzung eingestellt Werte. Als Beispiel:
SELECT * FROM "Foo" WHERE "Bar"=@param
Manchmal @param
könnte NULL
. In solchen Fällen, möchte ich die Abfrage Datensätze zurückgeben, wo Bar
ist NULL
, aber die obige Abfrage wird das nicht tun. Ich habe gelernt, dass ich das IS
Betreiber für das. In anderen Worten:
SELECT * FROM "Foo" WHERE "Bar" IS @param
Abgesehen von der unterschiedlichen Behandlung von NULL
, gibt es andere Möglichkeiten, in denen die beiden oben genannten Aussagen wird sich anders Verhalten? Was ist, wenn @param
ist nicht NULL
ist, sondern stattdessen, sagen wir mal, 5
? Ist mit der IS
Betreiber in diesem Fall ein Sicheres (und vernünftige) Sache zu tun? Gibt es einige andere Ansatz, den ich einnehmen sollte?
NULL
ist ein unbekannter oder nicht angegebener Wert, so dass nichts kann jemals gleich NULL
.InformationsquelleAutor Dan Moulding | 2011-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie Datensätze aus Foo where Bar = @param oder @param null ist, wo die Bar ist null. Einige der vorgeschlagenen Lösungen geben Sie die null-Datensätze mit null @param, das klingt nicht wie Ihre Anforderung.
Dieser nicht sagen, ob dies Oracle oder SQL Server oder einem anderen RDBMS, weil Sie jeder umsetzen leicht unterschiedlichen Hilfsfunktionen. SQL ist ISNULL(erste, zweite) wie NVL(erste, zweite). Ich mag SQL Server COALESCE() für die Allgemeine Anwendbarkeit.
Des IST-Vergleich ist nur für die null-Vergleiche.
Wenn Sie SQL Server verwenden und wenn Sie wirklich brauchen eine andere 3VL Logik Wahrheitstabelle um Ihr problem zu lösen (das ist, wenn Sie einen besonderen Bedarf für die "NULL=NULL" auf "true" an einem gewissen Punkt in der Zeit, und auch erkennen, dass diese veraltet ist, und abgesehen von Ihren Gründen, keine gute Idee im Allgemeinen), in deinem code-block können Sie die Richtlinie
SET ANSI_NULLS OFF
Hier ist der BOL:
http://msdn.microsoft.com/en-us/library/ms188048.aspx
IS
zu vergleichen mit nicht-null-Werte. Können Sie zitieren eine Quelle, die sagt, dass in standard-SQL den operator "IS" ist nur für null-Vergleiche?Eigentlich kann ich: in der SQL-92-standard (kostenlos auf der web), IST ein boolescher operator. Beide Seiten sind "boolean", die durch ANSI-standard. Null ist ein boolean-Wert in 3VL-Logik. Suche in diesem Dokument nach "8.12 <Suchbedingung>": contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt,
Und, ich sollte darauf hinweisen, jeder RDBMS-Anbieter ist frei, um die Umsetzung der Norm oder fügen Sie zusätzliche Elemente, aber Sie mag. Also, wenn SQLLite zur Verfügung stellen will, eine syntaktische Zucker, ist das Ihre Sache. Es ist nicht wie SQL-Server oder Oracle erhalten den vollen standard korrigieren sich selbst.
Danke für die Quelle. Also, es klingt wie es ist ein ziemlich großer Unterschied zwischen den beiden Operatoren in standard SQL. In SQLite SQL (was ich verwende) es klingt wie der einzige Unterschied ist die Behandlung von NULL. Danke für deine Antwort!
Ja, Sie haben gelöst, sowohl das konkrete Problem und bezwang meine Fähigkeit zu suchen, die ANSI-SQL-standard - Sie haben mein upvote als gut. 🙂
InformationsquelleAutor user662852
Denken Sie vielleicht über dieses falsch. Wenn du redest, SQL-Server, zum Beispiel (denn das ist es, was ich zur hand haben), das zweite Beispiel führt zu einem syntax-error. Der Wert auf der rechten Seite IST nicht 5.
Zu erklären, betrachten MSDN die Erläuterung dieser beiden Operatoren in T-SQL (beachten Sie, dass Fragen über "SQL" und "SQL-Server" sind nicht unbedingt die gleichen).
Ist-gleich-operator (=)
IS NULL-operator
Aufgefallen, dass etwas wichtiges gibt. Es ist keine solche Sache wie der operator "IS" in T-SQL. Es ist speziell die
<expression> IS [NOT] NULL
operator vergleicht einen einzelnen Ausdruck zu NULL.Das ist nicht das gleiche als
=
Betreiber, die vergleicht zwei Ausdrücke zu einander, und die hat bestimmte Verhalten, wenn einer oder beide Ausdrücke werden passiert NULL!5
auf der rechten Seite derIS
und sich so verhält, wie ich es intuitiv erwarten würde.Können Sie zitieren eine Quelle, die sagt, dass in standard-SQL
5
können nicht gesetzt werden, auf der rechten Seite desIS
? Oder werden Sie sagen, dassIS
ist auch nicht standard-SQL?Quelle für standard -
IS NULL/IS NOT NULL
Prädikat (im Gegensatz zuIS
Betreiber). Ich habe noch zu finden, Verweis aufIS
als ein standard-SQL-operator, wenn die SQLite-Dokumentation impliziert es wird standard reservierte Wort.InformationsquelleAutor Dan J
Bearbeiten:
(Update von OP: Dies nicht zu tun, was ich, Wenn @param 5 ist, dann möchte ich nur die Datensätze, wo die Bar ist mit 5. Ich möchte Datensätze anzeigen, wo die Bar ist NULL, wenn und nur wenn, @param NULL ist. Ich entschuldige mich, wenn meine Frage nicht stellen, klar.)
In diesem Fall, ich denke, Sie sollten versuchen, so etwas wie dieses:
Vorherigen post:
Warum nicht einfach verwenden, ODER ?
In SQL Server, die Sie verwenden können, ISNULL:
"In solchen Fällen, möchte ich die Abfrage Datensätze zurückgeben, wo die Bar ist NULL, aber die obige Abfrage wird das nicht tun." .. "Wird mit Hilfe des IS-operators in diesem Fall ein Sicheres (und vernünftige) Sache zu tun? Gibt es einige andere Ansatz, den ich einnehmen sollte?" Ich glaube, der OP ist in Erster Linie daran interessiert, einen sicheren Weg, dies zu erreichen. Ich weiß wirklich nicht den Unterschied zwischen denen, außer dass Sie bedeutete, dass für NULL-und ich glaube, das war die sekundäre Frage.
Ich glaube nicht, dass dies ist, was der OP wollte; immer diese Zeilen zurückgibt, wo
Bar IS NULL
, während die Frage sagt "Manchmal@param
kann NULL sein. In solchen Fällen, möchte ich die Abfrage Datensätze zurückgeben, woBar is NULL
". Nicht die gleiche Sache.Dies nicht zu tun, was ich will. Wenn
@param
5 ist, dann möchte ich nur die Datensätze, in denenBar
ist 5. Ich möchte Datensätze anzeigen, woBar
istNULL
wenn, und nur wenn@param
istNULL
. Ich entschuldige mich, wenn meine Frage nicht stellen, klar.Ah jetzt verstehe ich es..tut mir Leid... versuchen Sie, diese neue Abfrage, die ich aktualisiert habe...
InformationsquelleAutor Hari Menon
Ich weiß nicht, welche version von SQL, die Sie verwenden, IST aber keinen Sinn macht in dem Kontext, die Sie gerade beschrieben. Ich bekomme einen syntax-Fehler, wenn ich versuche, es zu benutzen die Weise, die Sie beschrieben. Warum würden Sie wollen, es zu benutzen über = eh? Dies ist die gemeinsame Nutzung und die eine software-Betreuer erwarten würde zu finden.
=
genau da brauche ich die Abfrage Ergebnisse zurückgibt, woBar
ist NULL, wenn@param
NULL ist. Die=
Betreiber nicht tun. Führen Sie nicht in ein syntax-Fehler auf dem system, das ich verwende (SQLite).Können Sie zitieren eine Quelle, die zeigt, dass mein Einsatz von
IS
ist ein syntax-Fehler im SQL-standard? (Ich verwende SQLite, die es zulässt, aber vielleicht ist das eine nicht-standard-Erweiterung).IST funktioniert nur wenn der Wert null ist in standard-SQL. Ich Habe noch nie verwendet, SQL lite, aber versucht haben Sie es, wenn Sie einen numerischen oder einen string-Wert anstelle der null ist?
InformationsquelleAutor HLGEM
Was bestimmte Datenbank verwenden Sie?
Wenn Sie die Suche basierend auf null (nicht null), verwenden, IST der Weg zu gehen. Ich kann nicht bieten einen technischen Grund, aber ich verwenden Sie diese syntax, die ganze Zeit.
@param
. Zur Laufzeit@param
manchmal NULL sein, und zu anderen Zeiten wird es nicht NULL sein.InformationsquelleAutor Angry Spartan