Halihallo Ilja
Genau, deshalb muss genau hier eine Konvention eingeführt werden,
die eben besagt, dass NULL als Auswertung der WHERE-Klausel als
FALSE *interpretiert* wird.ohne kleinlich wirken zu wollen, das bestätigt doch die aussage, dass es nur zwei ergebnisse bei bedingungen gibt, true oder false und nicht drei. NULL ist ein wert, den ein Feld innerhalb seiner domäne einnehmen kann. und bezogen auf eine bedingung kann ein argument einen wert von NULL einnehmen, nicht aber die gesamte bedingung.
Man muss hier vorsichtig mit der Wahl der Begriffe sein:
Der WHERE-"Teil" ist keine Bedingung sondern ein bool'scher
Ausdruck. Dieser hat wirklich drei mögliche Ergebnisse. Das WHERE
Keyword besagt einfach, dass wenn der bool'sche Ausdruck TRUE ist,
wird das Tupel selektiert. Was nun bei einem NULL passiert, ist eben
konventionssache.
Die Bedingung bei WHERE ist also: Falls bool'scher Ausdruck nach NULL
aufgelöst wird, wird das Tupel nicht selektiert, bei FALSE
ebensowenig, nur bei TRUE wird selektiert. Folglich ja, die Bedingung
kennt nur zwei Zustände, aber der bool'sche Ausdruck hat drei!
Aber ein bool'scher Ausdruck wird intern stets in dreiwertiger Logik
ausgewertet:
Verwende z.B. MySQL und gib dir folgendes aus:
SELECT 1+NULL;
gibt NULL und nicht true, false, 1 oder irgendwas anderes.
SELECT NULL OR 0;
gibt NULL und nicht FALSE (0).
die frage ist nur, wie eine bedingung diesen wert verarbeitet, sprich es gibt nicht drei zustände, sondern nur zwei was bedingungen betrifft, egal ob man sich nun für False oder TRUE entscheidet oder nicht ?
Bei der WHERE|HAVING-Klausel, ja. Die Bedingung liefert zwei mögliche
Ergebnisse. Aber intern wird der *Ausdruck* (nicht die Bedingung) in
einer dreiwertigen Logik verarbeitet. Beispiel:
Vielleicht ein kleines Beispiel, warum der Ausdruck wirklich
dreiwertig verarbeitet wird:
Wir haben eine Tabelle a mit einem Attribut a. Es existiert ein
Tupel, bei dem a NULL ist. Also:
Tabelle a:
a
NULL
SELECT * FROM a WHERE NOT(a)
Wenn man von einer zweiwertigen Logik ausginge und NULL als FALSE
interpretiert, würde NOT(a) TRUE sein! - Die RDBMS wird dir jedoch
ein Empty-Set liefern, warum? - Weil wenn a NULL ist, ist NOT(a) eben
auch wieder NULL und wird für die WHERE-Klausel in FALSE
uminterpretiert, somit wird kein Tupel selektiert => Empty-Set.
Fazit: Die Datenbank arbeitet intern mit einer dreiwertigen Logik und
wandelt in bestimmten Kontexten das Ergebnis in eine zweiwertige
Logik um (NULL:=FALSE). Aber: Das Ergebnis eines Ausdrucks ist und
wird immer dreiwertig bleiben, was die WHERE-*Bedingung* daraus macht
ist dann eine andere Geschichte.
Du siehst, du hast schon recht, eine WHERE|HAVING-*Bedingung* ist nur
zweiwertig, da ein NULL-Wert eben nicht ausgewertet werden könnte.
Aber der Ausdruck *ist* dreiwertig.
Ich hoffe, dass mit der kleinen Begriffsdefinition einiges klar
geworden ist, denn bool'scher Ausdruck != WHERE-Bedingung :-)
Viele Grüsse
Philipp