PostgreSQL RELATION ? [erledigt]

Alles zum SQL-Dialekt

Moderator: Moderatoren

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2527
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: PostgreSQL RELATION ?

Beitrag von UliTs » Fr, 27. Jul 2012 6:58

:?:
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11298
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: PostgreSQL RELATION ? [erledigt]

Beitrag von AUGE_OHR » Mo, 30. Jul 2012 5:05

ich möchte den Thread auf "REFERENCES" verlegen.
http://www.xbaseforum.de/viewtopic.php?f=24&t=6418
gruss by OHR
Jimmy

bgl
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 43
Registriert: Di, 30. Aug 2011 20:45

Re: PostgreSQL RELATION ?

Beitrag von bgl » Do, 02. Aug 2012 1:04

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.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14466
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: PostgreSQL RELATION ?

Beitrag von brandelh » Do, 02. Aug 2012 10:41

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:
Gruß
Hubert

bgl
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 43
Registriert: Di, 30. Aug 2011 20:45

Re: PostgreSQL RELATION ?

Beitrag von bgl » Do, 02. Aug 2012 11:52

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 :-/

Antworten