Es bedeutet , dass keine Zeilen zurückgegeben werden , wenn @region
ist NULL
, wenn in Ihrem ersten Beispiel verwendet wird , auch wenn es Zeilen in der Tabelle , wo Region
ist NULL
.
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 zu TRUE
und FALSE
).
UNKNOWN
Werte verbreiten sich durch alle kombinierenden booleschen Operatoren, wenn sie nicht bereits entschieden wurden (z. B. AND
mit einem FALSE
Operanden oder OR
mit einem TRUE
Operanden) oder negations ( NOT
).
Die WHERE
Klausel wird verwendet, um die von der FROM
Klausel erzeugte Ergebnismenge zu filtern , sodass der Gesamtwert der WHERE
Klausel sein muss, TRUE
damit die Zeile nicht herausgefiltert wird. Wenn UNKNOWN
also durch einen Vergleich ein erzeugt wird, wird die Zeile herausgefiltert.
Die Antwort von @ user1227804 enthält dieses Zitat:
Wenn beide Seiten des Vergleichs Spalten oder zusammengesetzte Ausdrücke sind, wirkt sich die Einstellung nicht auf den Vergleich aus.
von *SET ANSI_NULLS
Ich bin mir jedoch nicht sicher, welchen Punkt es anstrebt, da beim NULL
Vergleich zweier Spalten (z. B. in a JOIN
) der Vergleich immer noch fehlschlägt:
create table #T1 (
ID int not null,
Val1 varchar(10) null
)
insert into #T1(ID,Val1) select 1,null
create table #T2 (
ID int not null,
Val1 varchar(10) null
)
insert into #T2(ID,Val1) select 1,null
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and t1.Val1 = t2.Val1
Die obige Abfrage gibt 0 Zeilen zurück, während:
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and (t1.Val1 = t2.Val1 or t1.Val1 is null and t2.Val1 is null)
Gibt eine Zeile zurück. Selbst wenn beide Operanden Spalten sind, ist NULL
dies nicht gleich NULL
. Und die Dokumentation zu=
hat nichts zu den Operanden zu sagen:
Wenn Sie zwei NULL
Ausdrücke vergleichen , hängt das Ergebnis von der ANSI_NULLS
Einstellung ab:
Wenn auf ANSI_NULLS
gesetzt ist, ON
ist das Ergebnis NULL
1 , gemäß der ANSI-Konvention, dass ein NULL
(oder unbekannter) Wert nicht gleich einem anderen NULL
oder unbekannten Wert ist.
Wenn ANSI_NULLS
festgelegt ist OFF
, das Ergebnis im NULL
Vergleich zu NULL
ist TRUE
.
Der Vergleich NULL
mit einem Nichtwert NULL
ergibt immer FALSE
2 .
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.