Die Definition sagt:
Wenn SET ANSI_NULLS aktiviert ist, gibt eine SELECT-Anweisung, die WHERE Spaltenname = NULL verwendet, Nullzeilen zurück, auch wenn Spaltenname Nullwerte enthält. Eine SELECT-Anweisung, die WHERE Spaltenname <> NULL verwendet, gibt Nullzeilen zurück, auch wenn Spaltenname Nicht-Null-Werte enthält.
Bedeutet dies, dass diese Abfrage keine Nullen enthält?
SELECT Region
FROM employees
WHERE Region = @region
Oder handelt es ANSI_NULL
sich nur um Anfragen wie diese (bei denen WHERE
das spezifische Wort enthalten ist NULL
)?
SELECT Region
FROM employees
WHERE Region = NULL
sql
tsql
stored-procedures
Rodniko
quelle
quelle
Antworten:
Es bedeutet , dass keine Zeilen zurückgegeben werden , wenn
@region
istNULL
, wenn in Ihrem ersten Beispiel verwendet wird , auch wenn es Zeilen in der Tabelle , woRegion
istNULL
.Wenn aktiviert
ANSI_NULLS
ist (was Sie sowieso immer aktivieren sollten, da die Option, es nicht zu aktivieren, in Zukunft entfernt wird), erzeugt jede Vergleichsoperation, bei der (mindestens) einer der Operanden ausgeführt wird,NULL
den dritten logischen Wert -UNKNOWN
( im Gegensatz zuTRUE
undFALSE
).UNKNOWN
Werte verbreiten sich durch alle kombinierenden booleschen Operatoren, wenn sie nicht bereits entschieden wurden (z. B.AND
mit einemFALSE
Operanden oderOR
mit einemTRUE
Operanden) oder negations (NOT
).Die
WHERE
Klausel wird verwendet, um die von derFROM
Klausel erzeugte Ergebnismenge zu filtern , sodass der Gesamtwert derWHERE
Klausel sein muss,TRUE
damit die Zeile nicht herausgefiltert wird. WennUNKNOWN
also durch einen Vergleich ein erzeugt wird, wird die Zeile herausgefiltert.Die Antwort von @ user1227804 enthält dieses Zitat:
von *
SET ANSI_NULLS
Ich bin mir jedoch nicht sicher, welchen Punkt es anstrebt, da beim
NULL
Vergleich zweier Spalten (z. B. in aJOIN
) der Vergleich immer noch fehlschlägt:Die obige Abfrage gibt 0 Zeilen zurück, während:
Gibt eine Zeile zurück. Selbst wenn beide Operanden Spalten sind, ist
NULL
dies nicht gleichNULL
. Und die Dokumentation zu=
hat nichts zu den Operanden zu sagen:Sowohl 1 als auch 2 sind jedoch falsch - das Ergebnis beider Vergleiche ist
UNKNOWN
.* Die kryptische Bedeutung dieses Textes wurde Jahre später entdeckt. Was es tatsächlich bedeutet, ist, dass für diese Vergleiche die Einstellung keine Auswirkung hat und sich immer so verhält, als ob die Einstellung eingeschaltet wäre . Wäre klarer gewesen, wenn angegeben worden wäre, dass dies
SET ANSI_NULLS OFF
die Einstellung war, die keinen Einfluss hatte.quelle
Wenn
@Region
es sich nicht um einennull
Wert handelt (z. B.@Region = 'South'
), werden unabhängig vom Wert von ANSI_NULLS keine Zeilen zurückgegeben, in denen das Feld Region null ist.ANSI_NULLS macht nur dann einen Unterschied, wenn der Wert von
@Region
istnull
, dh wenn Ihre erste Abfrage im Wesentlichen die zweite wird.In diesem Fall gibt ANSI_NULLS ON keine Zeilen zurück (da dies
null = null
einen unbekannten booleschen Wert ergibt (auch bekannt alsnull
)), und ANSI_NULLS OFF gibt alle Zeilen zurück, in denen das Feld Region null ist (weil diesnull = null
ergibttrue
).quelle
Wenn ANSI_NULLS auf "ON" gesetzt ist und wir beim Schreiben der select-Anweisung =, <> auf den NULL-Spaltenwert anwenden, wird kein Ergebnis zurückgegeben.
Beispiel
SET ANSI_NULLS ON
SET ANSI_NULLS OFF
quelle
WHERE X IS NULL
undWHERE X = NULL
unterscheidet und wie ANSI_NULLS das Ergebnis beeinflusst. Trotz der übereifrigen Versuche der Wähler nach unten sollte DIES die akzeptierte Antwort sein!SET ANSI_NULLS ON
IT Gibt alle Werte einschließlich der Nullwerte in der Tabelle zurück
SET ANSI_NULLS aus
Es endet, wenn Spalten Nullwerte enthalten
quelle
Ich denke, die Hauptsache hier ist:
Niemals Benutzer:
@anything = NULL
@anything <> NULL
@anything != null
Verwenden Sie immer:
@anything IS NULL
@anything IS NOT NULL
quelle
Wenn Sie ANSI NULLS OFF setzen, wird die Vergleichsrückgabe NULL = NULL true. Z.B :
gibt ein Ergebnis zurück, wie unten angezeigt: zcwInvoiceDeliveryType 744547 NULL zcExpenseRptStatusTrack 2099048 NULL ZCVendorPermissions 2840564 NULL ZCWOrgLevelClientFee 4322525 NULL
Während diese Abfrage keine Ergebnisse zurückgibt:
quelle
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql
Wenn SET ANSI_NULLS aktiviert ist, gibt eine SELECT-Anweisung, die WHERE Spaltenname = NULL verwendet, Nullzeilen zurück, auch wenn Spaltenname Nullwerte enthält. Eine SELECT-Anweisung, die WHERE spaltenname <> NULL verwendet, gibt null Zeilen zurück, auch wenn in spaltenname nicht null Werte enthalten sind.
Zum Beispiel
quelle