Das unerwartete Verhalten von NULL-Werten und der NOT IN
-Klausel in SQL verstehen
SQL-Abfragen führen oft zu überraschenden Ergebnissen, wenn NULL
-Werte mit dem NOT IN
-Operator interagieren. Diese Diskrepanz wird deutlich, wenn eine NOT IN
-Abfrage mit einer äquivalenten Abfrage unter Verwendung eines LEFT JOIN
.
Bedenken Sie diese Fragen:
<code class="language-sql">A: select 'true' where 3 in (1, 2, 3, null) B: select 'true' where 3 not in (1, 2, null)</code>
Abfrage A gibt ein Ergebnis zurück, Abfrage B jedoch nicht. Die Hauptursache liegt darin, wie unterschiedliche SQL-Datenbanken NULL
-Werte verarbeiten.
Wenn ANSI_NULLS
aktiviert ist (die Standardeinstellung in vielen Systemen wie SQL Server 2005), wird jeder Vergleich mit NULL
, wie z. B. 3 = NULL
, als UNKNOWN
ausgewertet. Diese Unbestimmtheit ergibt sich aus der inhärenten Unsicherheit von NULL
.
In Abfrage B trifft der NOT IN
-Operator auf NULL
in der Unterabfrage, was zu einer UNKNOWN
-Auswertung führt. Da keine anderen Werte übereinstimmen, wird das gesamte Prädikat zu UNKNOWN
, was eine leere Ergebnismenge ergibt.
Umgekehrt verändert die Deaktivierung von ANSI_NULLS
das Verhalten. Wenn ANSI_NULLS
deaktiviert ist, wird 3 = NULL
zu TRUE
ausgewertet. SQL interpretiert NULL
als potenziell gleich mit allem, einschließlich sich selbst. Folglich ergibt das Prädikat von Abfrage B TRUE
und gibt ein Ergebnis zurück.
Kurz gesagt, die inkonsistenten Ergebnisse sind auf die unterschiedliche Behandlung von NULL
-Werten zurückzuführen, die durch die ANSI_NULLS
-Einstellung bestimmt werden. Wenn ANSI_NULLS
aktiviert ist, erzeugen Vergleiche mit NULL
UNKNOWN
, was zu unerwarteten Ergebnissen bei Abfragen führt, die NOT IN
- und NULL
-Werte verwenden. Dies unterstreicht, wie wichtig es ist, die NULL
-Behandlung in SQL für genaue Abfrageergebnisse zu verstehen.
Das obige ist der detaillierte Inhalt vonWarum führen NULL-Werte mit der NOT IN-Klausel von SQL zu unerwarteten Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!