Halihallo Ilja
Der WHERE-"Teil" ist keine Bedingung sondern ein bool'scher
Ausdruck.
ich habe noch mal in meinen unterlagen nachgeschaut und zumindestens die oracle lehr(leer)bücher sprechen von conditions in der WHERE klausel also von bedingungen. diese bedingungen können durchaus durch logische (bool'sche) operatoren miteinander verbunden werden, muss aber nicht.
Klar. Du kannst auch WHERE substr(attr,0,5) schreiben, das substr-
Ergebnis wird einfach entweder als TRUE, FALSE oder NULL gewertet.
Es ist jedoch in jedem Fall ein Prädikat (ob nun bool'sche Operatoren
vorkommen oder nicht).
insofern würde ich immer noch von bedingungen in der WHERE klausel sprechen. und bei diesen logischen operatoren ist in meinen buch auch nur von zwei zuständen die rede, true und false, ein dritter kommt dort nicht vor, wenn zum beispiel erklärt wird, wie AND, OR und NOT funktioniert.
Schmeiss das Buch weg :-)
Gibt's darin kein Kapitel über NULL-Werte?
Keyword besagt einfach, dass wenn der bool'sche Ausdruck TRUE ist,
wird das Tupel selektiert. Was nun bei einem NULL passiert, ist eben
konventionssache.
eine bedingung kann immer noch meiner meinung nach nicht NULL sein, sondern eben nur TRUE oder FALSE. ein wert innerhalb einer bedingung kann sehr wohl NULL sein.
Nicht nur ein Wert, sondern auch ganze Teilausdrücke. Am Schluss
bleibt einfach true oder false übrig, das kann ich stehen lassen.
SELECT 1+NULL;
gibt NULL und nicht true, false, 1 oder irgendwas anderes.
SELECT 1, 2, 3, 4, NULL FROM dual;
das beispiel ist nun in meinen augen merkwürdig, weil ganz einfach viel mehr als nur drei werte herauskommen können. es zeigt eigentlich nur, das NULL eben ein wert unter vielen ist, auch wenn es sich um einen besonderen wert handelt.
Achtung, das ist zwar richtig. Ich spreche jedoch nicht von Ausgabe,
sondern von Prädikaten/Bedingungen/bool'schen Ausdrücken, nicht von
Werten.
SELECT NULL OR 0;
gibt NULL und nicht FALSE (0).
jau, weil es auch keine bedingung ist.
Nein, immer. Was die "Bedingung" daraus macht ist ihr Süppchen.
SELECT if(NULL, 1, 0);
das gibt 0 zurück.
Natürlich. Das IF-Statement besagt, dass wenn die Bedingung zu true
ausgewertet wird, 1 zurückgegeben wird, 0 andernfalls. "NULL!=true"
deshalb wird 0 ausgegeben.
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.
um ehrlich zu sein, dieses beispiel würde meiner meinung nach für meine these sprechen oder ich lese einfach nur falsch. würde es drei zustände geben, könnte er ein record-set zurückliefern, nämlich den mit den wert NULL.
Nein und ja. Was soll die Datenbank bei dem Prädikat NULL machen.
Dies heisst weder true noch false, also soll jetzt die Datenbank das
Tupel aufnehmen oder nicht? - Es nimmt es nicht auf, weil es eine
Konvention ist, dass NULL bei der WHERE-Klausel false ist.
da NULL werte innheralb einer bedingung aber grundsätzlich als FALSE gewertet werden, gibt er keinen zurück. und zweimal FALSE ergibt keinen record in der ergebnistabelle. würde es wirklich true, false und NULL geben, könnte er eventuell den NULL wert zurückgeben. tut aber nicht und das widerspricht nicht meiner annahme.
Es wiederspricht deiner Annahme nicht und meiner genausowenig. Wir
sagen ja unter dem Strich genau dasselbe, nur mit anderer
Argumentation.
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.
nun ja, ich sprach von bedingungen und die kommen nun mal in der WHERE klausel vor. insofern ist es nicht ganz unerheblich, was daraus gemacht wird. ich habe imme noch den eindruck, NULL ist nur ein besonderer wert eines feldes, aber keine dritte option, die eine bedingung einnehmen kann.
Oh, oh. Lies mal:
http://www.informatik.uni-stuttgart.de/ipvr/as/lehre/skripte/DBISWS0203/kapitel05.pdf
(Seite: 5-50), dort siehst du dass AND, OR, NOT etc. alle dreiwertig
sind und <cite>Das Ergebnis NULL bei einer Auswertung einer WHERE-
Klausel wird wie false behandelt</cite>
http://www.ipd.uni-karlsruhe.de/~ovid/Seminare/IMPWS03/Vortraege/OVID-IMPWS03_Null-Werte_in_Relationalen_Datenbanken.pdf
http://www.ipd.uni-karlsruhe.de/~ovid/Seminare/IMPWS03/Ausarbeitungen/OVID-IMPWS03_Null-Werte_in_Relationalen_Datenbanken_Ausarbeitung.pdf
(hab mal kurz gegoogled...)
Viele Grüsse
Philipp