AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Wie mit Feldern vergleichen, die (NULL) sind

Wie mit Feldern vergleichen, die (NULL) sind

Ein Thema von LeisureSuitLarry · begonnen am 13. Mai 2015 · letzter Beitrag vom 15. Mai 2015
Antwort Antwort
LeisureSuitLarry

Registriert seit: 8. Dez 2005
Ort: Unterschleißheim
90 Beiträge
 
Delphi 2010 Professional
 
#1

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

  Alt 13. Mai 2015, 17:19
ich kenne 'coalesce' gar nicht. Wenn es die einzige Klausel ist funktioniert es.
Wenn es aber mehrere gibt, findet er wieder nichts, also z. B.

update tabelle
set X=Y
where (coalesce(x, '') <> '') and (coalesce(z, '') <> '')

z ist eine weiter Spalte, die auch NULL sein kann.
Manfred
Mein erster Rechner hatte eine Z80A-CPU mit 4MHz, 64KB Speicher, Musikkassetten als Speichermedium. Als Betriebssystem CP/M (dazu gekauft)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

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

  Alt 13. Mai 2015, 17:27
where (coalesce(x, '') <> '') and (coalesce(z, '') <> '')
In dem Fall müssten ja beide Spalten gemeinsam Null sein. Gibt es solche Datensätze?
Gruß, Jo
  Mit Zitat antworten Zitat
LeisureSuitLarry

Registriert seit: 8. Dez 2005
Ort: Unterschleißheim
90 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 13. Mai 2015, 17:29
ja, es gibt mehrere Spalten die NULL sein können.
Manfred
Mein erster Rechner hatte eine Z80A-CPU mit 4MHz, 64KB Speicher, Musikkassetten als Speichermedium. Als Betriebssystem CP/M (dazu gekauft)
  Mit Zitat antworten Zitat
LeisureSuitLarry

Registriert seit: 8. Dez 2005
Ort: Unterschleißheim
90 Beiträge
 
Delphi 2010 Professional
 
#4

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

  Alt 13. Mai 2015, 17:31
Ja, es gibt mehrere Spalten die NULL sind.

sorry, Doppelpost
Manfred
Mein erster Rechner hatte eine Z80A-CPU mit 4MHz, 64KB Speicher, Musikkassetten als Speichermedium. Als Betriebssystem CP/M (dazu gekauft)

Geändert von LeisureSuitLarry (13. Mai 2015 um 17:33 Uhr) Grund: sorry, Doppelpost
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 13. Mai 2015, 22:17
Feld<>Null sollte eigentlich eine Fehlermeldung produzieren
Wenn Du ein Feld auf Null oder einen Inhalt prüfen willst dann so:
SQL-Code:
..
and (Feld=irgendwas or Feld is null)
...
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

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

  Alt 14. Mai 2015, 06:02
feld<>NULL ist ein valider Ausdruck und sollte keine Fehlermeldung ausgeben. <-- edit.

Nichts ist == NULL. Ebenso ist nichts <> NULL. NULL ist nicht vergleichbar. Daher gibt es IS NULL und IS NOT NULL.

Code:
Update table set x=y where x is null
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.

Geändert von Dejan Vu (14. Mai 2015 um 08:48 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

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

  Alt 14. Mai 2015, 07:27
Ja, es gibt mehrere Spalten die NULL sind.
Spalten können nicht NULL sein, sondern einzelne Felder einzelner Records. Spalten bestehen aus demselben Feld aller in dieser Tabelle gespeicherten Records. In einer Spalte können manche Einträge NULL sein und andere wiederum nicht. Die Spalte bzw. das Feld wird in der Tabellendefinition deklariert und kann wie gesagt nicht NULL sein, das ist überhaupt keine Eigenschaft einer Spalte.

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?

Also ich muß da nur einmal überlegen, ob ich z.B. eine Selection "where Feld is Null" anfordere oder nicht. Oder besser, ich muß eigentlich gar nicht überlegen, denn da gibt's nicht wirklich was zu überlegen, wenn man die Records einer Tabelle, deren Feld X Null ist, benötigt, z.B.:
Code:
select * from PERSONEN where PERS_ADRES is null
Oder in Delphi:

Qset_Personen.Filter := 'PERS_ADRES is null'; Was also sollte man da groß überlegen? Und was soll am Beispiel von p80286 komplex sein?

Geändert von Perlsau (14. Mai 2015 um 07:34 Uhr)
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
223 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

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

  Alt 14. Mai 2015, 07:52
er testet auf ungleich null


update Tabelle set X=Y where x<>NULL


richtig wäre also IS NOT NULL

update Tabelle set X=Y where x is not null
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

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

  Alt 14. Mai 2015, 08: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 08:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz