Ilja: MySQL-select-Suchfunktion verfeinern

Beitrag lesen

yoho Philipp,

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. 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.

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.

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.

SELECT NULL OR 0;

gibt NULL und nicht FALSE (0).

jau, weil es auch keine bedingung ist.

SELECT if(NULL, 1, 0);

das gibt 0 zurück.

Bei der WHERE|HAVING-Klausel, ja. Die Bedingung liefert zwei mögliche
Ergebnisse.

grundsätzlich würde mir diese aussage ja reichen.

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. 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.

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.

Ilja