Ich bin immer verwirrt über ein mysteriöses T-SQL-Verhalten wie das folgende
-- Create table t and insert values.
use tempdb
CREATE TABLE dbo.t (a INT NULL);
-- insert 3 values
INSERT INTO dbo.t values (NULL),(0),(1);
GO
set ansi_nulls off -- purposely turn off, so we can allow NULL comparison, such as null = null
go
-- expect 3 rows returned but only 2 returned (without null value row)
select * from dbo.t where a = a
Hierbei geht es nicht darum, wie alle Zeilen in einer Tabelle abgerufen werden, und auch nicht darum, die Verwendung von ANSI_NULLS zu vermeiden.
Ich möchte nur einige Einblicke gewinnen, warum sich t-sql so verhält.
Robert Sheldon im folgenden Beitrag aus dem Jahr 2015 erläutert NULL-Verhalten und warum sie manchmal (aber nicht immer) fehlschlagen
https://www.simple-talk.com/sql/t-sql-programming/how-to-get-nulls-horribly-wrong-in-sql-server/
Er beschreibt 13 NULL-Fehler, über die ein Programmierer leicht stolpern kann.
Fehler Nr. 1: Keine Ahnung, was NULL bedeutet
Erläuterung: NULL ist ein nicht vorhandener Wert. Es ist nicht Null. Es ist keine leere Zeichenfolge. Ein Wert kann nicht gleich NULL sein. Keine zwei NULL-Werte sind gleich .
Das ist das Grundproblem, aber lesen Sie auch die anderen Fehler.
Ja, frühere Versionen (Pre-SQL Server 7, glaube ich) haben sich anders verhalten, eher so, wie Sie es sich wünschen.
Wenn Sie jedoch nach dem Problem in Stack Overflow und Stack Exchange suchen, finden Sie viele lange Threads, in denen die Probleme behandelt werden.
quelle
WHERE NULL = NULL
sich bei der Einstellung von true ergibt.Um die Diskussion zu erweitern, kann die Definition von NULL des SQL92- Standards mehrdeutig interpretiert werden. Hier ist eine gute Zusammenfassung der NULL-Behandlung und -Interpretation von verschiedenen DBMS mit freundlicher Genehmigung von sqlite.org.
OFFENLEGUNG : Ich erinnere mich, dass ich etwas über die "Mehrdeutigkeit" von SQL92 aus einer älteren Version (wie vor 6-8 Jahren) der oben verlinkten sqlite.org-Seite gelesen habe, aber diese Seite wurde seitdem aktualisiert.
Die obige Antwort von RLF hat ein gutes Zitat, aber wenn ich mit Robert Sheldon nicht einverstanden bin, dann nur, weil ich "etwas, das nicht existiert" (dh eine NULL ) als philosophisch und englischsprachig-semantisch äquivalent zu "etwas anderem , das nicht existiert" betrachte ". Wenn ich Sheldons Logik verstehen will, könnte man erklären, dass die Definition von NULL auch NULL ist. (Wenn es nicht existiert, wie können wir es dann definieren? Gruselig, oder?)
Ich sehe eine Variation von Russells Paradox- Brauen ( und Kopfschmerzen). : - \
Aber auch dies ist eine Diskussion über die englische Sprachsemantik ( NICHT SQL) und die philosophische Debatte gehört hierher . :-)
quelle