ich möchte den Thread auf "REFERENCES" verlegen.
http://www.xbaseforum.de/viewtopic.php?f=24&t=6418
PostgreSQL RELATION ? [erledigt]
Moderator: Moderatoren
Re: PostgreSQL RELATION ?
Einspruch: Kritik an der 3-valued-logic einmal aussen vor gelassen, passiert relativ zuverlässig folgendes:brandelh hat geschrieben:Die Nachforschungen ergaben, dass je nach SQL Server WHERE Vergleichswerte mit NULL ein True oder ein False zurückliefern.
SELECT NULL=1;
=> NULL
SELECT NULL=NULL;
=> NULL
SELECT NULL IS NULL;
=> TRUE
SELECT NULL IS NOT NULL;
=> FALSE
SELECT 0 IS NULL;
=> FALSE
SELECT 0=NULL;
=> NULL
Zusammengefasst: BOOL'sche Vergleiche auf NULL liefern idR NULL zurück und werden weitestgehend als "omg, das ignorieren wir besser" behandelt. Willst du auf NULL-Werte prüfen, so fragst du explizit mittels IS (NOT) NULL, dann gibts auch wieder brav TRUE oder FALSE zurück und damit kann man WHERE-Statements bauen.
Hast du also einen Fall von Access, wo ein Feld '' oder NULL beinhalten kann und die GUI dir keinen Unterschied anzeigt, dann fragst du nach WHERE feldname='' OR feldname IS NULL;
Da sind sich die diversen SQL-Datenbanksysteme aber recht einig.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: PostgreSQL RELATION ?
Was ich meinte war ein anderer Fall ...bgl hat geschrieben:Einspruch: Kritik an der 3-valued-logic einmal aussen vor gelassen, passiert relativ zuverlässig folgendes:brandelh hat geschrieben:Die Nachforschungen ergaben, dass je nach SQL Server WHERE Vergleichswerte mit NULL ein True oder ein False zurückliefern.
Hast du also einen Fall von Access, wo ein Feld '' oder NULL beinhalten kann und die GUI dir keinen Unterschied anzeigt, dann fragst du nach WHERE feldname='' OR feldname IS NULL;
Da sind sich die diversen SQL-Datenbanksysteme aber recht einig.
Xbase++ Datenbank (10.000 Datensätze, 5 mit Sperrvermerk 'XYZ' irgendwo im Anschriftenfeld):
Code: Alles auswählen
Anschrift1 = "Mein Name"
Anschrift2 = "Meine Straße"
Anschrift3 = "Plz Ort "
Anschrift4 = ""
Anschrift5 = ""
Anschrift6 = ""
...
// gewünscht, alle Anschreiben, solange nicht "XYZ" in einem der Anschriftsfelder enthalten ist ...
if ! "XYZ" $ Anschrift1+Anschrift2+Anschrift3+Anschrift4+Anschrift5+Anschrift6
Drucken()
...
Wenn man - wie ich es immer tue - default Wert '' zuordnet oder beim Speichern das Feld mit "" bestückt,
sollte der Select auch 9.995 Datensätze finden (die Syntax in SQL spare ich mir mal, da bin ich aus dem Kopf zu unsicher )
Mein Kollege hatte aber eine Access Datei, die in den Feldern Anschrift 4 bis 6 fast immer (zum Glück, sonst wäre es wohl nicht aufgefallen) NULL hatte
und hat abgefragt ob der Text "XYZ" (der genaue Text ist jetzt ohne Interesse, genauso warum sowas im Anschriftenfeld stehen kann )
Ergebnis 500 Datensätze gefunden
Denn die NULL im Feld Anschrift6 hat den kompletten Satz aus der Zielmenge geworfen, obwohl umgangssprachlich
der Satz wenn er NIX (null) enthält ja auf keinen Fall "XYZ" enthalten könnte
Ich wollte nur darauf hinweisen, dass man beim "1:1 übersetzen der Logic und Denkweise" aufpassen muss
Gruß
Hubert
Hubert
Re: PostgreSQL RELATION ?
Ich wusste ich habe ein Beispiel vergessen:brandelh hat geschrieben:Ergebnis 500 Datensätze gefunden
Denn die NULL im Feld Anschrift6 hat den kompletten Satz aus der Zielmenge geworfen, obwohl umgangssprachlich
der Satz wenn er NIX (null) enthält ja auf keinen Fall "XYZ" enthalten könnte
Ich wollte nur darauf hinweisen, dass man beim "1:1 übersetzen der Logic und Denkweise" aufpassen muss
SELECT NULL != 'xyz';
=> NULL
Du hast grundsätzlich recht mit deiner Warnung, das Prinzip ist aber einfach: jede bool'sche Frage auf einen NULL-Wert gibt NULL zurück und NULL als Ergebnis einer Bedingung heisst idR, dass der Datensatz ausgelassen wird, dieses Verhalten allerdings ist in der Tat nicht 100% zuverlaessig. Deshalb fragt man halt explizit nach NULL (oder setzt Felder aus Prinzip auf NOT NULL).
Three-Valued Logic heisst eben, dass man nach allem doppelt und dreifach fragen muss :-/