Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#18

AW: Wie mit Feldern vergleichen, die (NULL) sind

  Alt 14. Mai 2015, 09:40
Im Beispiel von p80286 sieht man, wie komplex die Arbeit mit NULL Werten werden kann. Daher sollte man davon Abstand nehmen, bzw. dreimal überlegen, ob NULL als abzufragendes Datum wirklich notwendig ist.
Das verstehe ich jetzt nicht: Wie sollte man dann ohne den Test auf Null herausfinden, ob ein Feld einen Eintrag enthält? Jetzt erzählst du mir sicher gleich, das käme in der Praxis nicht vor, oder?
Falsch, denn Du hast maximal 1x nachgedacht . Wenn man in seiner Logik die Abfrage auf NULL benötigt, sollte man hinterfragen, was man damit eigentlich beabsichtigt und dies dann ggf anders formulieren. Speziell bei parametrierten Abfragen wird das dann zu einer sehr unübersichtlichen Angelegenheit:
Code:
select * from Tabelle
  Where (Name is null or Name = :Name)
     or (Foobar is Null or Foobar = :Foobar)
   ...
Natürlich könnte man COALESCE oder ISNULL nehmen, aber da geht dann der Vorteil eines Index schnell flöten.
Bei einer Abfrage auf 'Daten vorhanden/nicht vorhanden' ist das natürlich vollkommen ok, aber wenn die Spalte in Reportfiltern vorkommt, ist das dann wieder blöd, wg. (siehe oben).

Was also sollte man da groß überlegen? Und was soll am Beispiel von p80286 komplex sein?
Die Notwendigkeit, einerseits auf den Wert und andererseits auf NULL prüfen zu müssen.

Etwas OT: Stell dir vor, Deine Tabelle enthält eine Spalte 'A varchar(10) NULL'. Du schreibst nun einen Report und möchtest das Ergebnis filtern, so etwa:
select * from Tabelle where A=:A Nun kann die Spalte A NULL-Werte enthalte, weil, ist ja nicht komplex. Nun willst Du auch darauf abfragen können. Wie machst Du das jetzt? Dein Parameter 'A' kann ja schlecht 'NULL' enthalten, also?
Code:
select * from Tabelle
where (:A is not null and A=:A)
   or (:A is null and A is null)
Stimmt das überhaupt so? (Query Optimizer lieben deartige Konstrukte übrigens). Wie Du siehst, ist das spätestens jetzt komplex, vor allen Dingen dann, wenn sich das über alle Spalten hinzieht. Also lieber: Finger weg (oder keine Reports mit NULL-Filtermöglichkeit).

Wenn man einen Report benötigt, der auch alle z.B. unausgefüllten TelefonNr-Spalten zeigt, dann lieber explizit als separaten Report oder man deklariert die Telefon-Spalte als NOT NULL und dann hat der leere String die Bedeutung: 'unausgefüllt'.

Aber klar: Manchmal geht es nicht anders und dann ist man auch wieder froh über NULL (LEFT JOIN z.B.)

PS: Das mit dem Kaffee war ein gutes Stichwort.

Geändert von Dejan Vu (14. Mai 2015 um 09:46 Uhr)
  Mit Zitat antworten Zitat