Seite 2 von 2

Re: PostgreSQL RELATION ?

Verfasst: Fr, 27. Jul 2012 6:58
von UliTs
:?:

Re: PostgreSQL RELATION ? [erledigt]

Verfasst: Mo, 30. Jul 2012 5:05
von AUGE_OHR
ich möchte den Thread auf "REFERENCES" verlegen.
http://www.xbaseforum.de/viewtopic.php?f=24&t=6418

Re: PostgreSQL RELATION ?

Verfasst: Do, 02. Aug 2012 1:04
von bgl
brandelh hat geschrieben:Die Nachforschungen ergaben, dass je nach SQL Server WHERE Vergleichswerte mit NULL ein True oder ein False zurückliefern.
Einspruch: Kritik an der 3-valued-logic einmal aussen vor gelassen, passiert relativ zuverlässig folgendes:

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.

Re: PostgreSQL RELATION ?

Verfasst: Do, 02. Aug 2012 10:41
von brandelh
bgl hat geschrieben:
brandelh hat geschrieben:Die Nachforschungen ergaben, dass je nach SQL Server WHERE Vergleichswerte mit NULL ein True oder ein False zurückliefern.
Einspruch: Kritik an der 3-valued-logic einmal aussen vor gelassen, passiert relativ zuverlässig folgendes:
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.
Was ich meinte war ein anderer Fall ...

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()
...
Ich denke wir sind uns einig, dass von den 10.000 Datensätzen genau 9.995 gedruckt werden.
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 :D )

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 :oops:
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 :D

Ich wollte nur darauf hinweisen, dass man beim "1:1 übersetzen der Logic und Denkweise" aufpassen muss :wink:

Re: PostgreSQL RELATION ?

Verfasst: Do, 02. Aug 2012 11:52
von bgl
brandelh hat geschrieben:Ergebnis 500 Datensätze gefunden :oops:
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 :D

Ich wollte nur darauf hinweisen, dass man beim "1:1 übersetzen der Logic und Denkweise" aufpassen muss :wink:
Ich wusste ich habe ein Beispiel vergessen:
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 :-/