Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Wie mit Feldern vergleichen, die (NULL) sind (https://www.delphipraxis.net/185081-wie-mit-feldern-vergleichen-die-null-sind.html)

LeisureSuitLarry 13. Mai 2015 15:47

Datenbank: MySQL • Version: 5.6 • Zugriff über: HeidiSQL

Wie mit Feldern vergleichen, die (NULL) sind
 
Hallo,

wie nenne ich den Zustand NULL in einem Vergleich die NULL, also leer sind?
Also z. B. Name<>'' oder Name<>NULL?

Danke im Voraus

Manfred

mkinzler 13. Mai 2015 15:49

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
Delphi-Quellcode:
If <Field>.isNull then ...

DeddyH 13. Mai 2015 15:50

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
SQL-Code:
WHERE Name IS NOT NULL
[edit] *g* Du hättest dazusagen sollen, ob Du Delphi oder SQL meinst. [/edit]

LeisureSuitLarry 13. Mai 2015 16:43

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
habe die Vorschläge von mkinzler und DeddyH probiert... Fehlermeldung.

Es geht um eine SQL-Abfrage... in HeidiSQL, mein Werkzeug für mySQL.

vagtler 13. Mai 2015 16:47

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
Da die Fehlermeldung ja anscheinend irgendwelchen Geheimhaltungsvorschriften unterliegt, ist eine weitere Hilfe abhängig von der Bereitstellung einer funktionierenden Kristallkugel.

Bambini 13. Mai 2015 16:51

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

... mkinzler und DeddyH probiert... Fehlermeldung.
Was für eine Fehlermeldung gibt es denn.

Delphi-Quellcode:
WHERE (Name <> '') OR (Name IS NOT NULL)
sieht auf den ersten Blick recht gut aus.

LeisureSuitLarry 13. Mai 2015 16:55

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
es geht um eine Abfrage wie

update tabelle
set X=Y
where x<>NULL

Leider interessiert es nicht, was ich als NULL eintrage. Es wird nichts aktualisiert.
/* Affected rows: 0 Gefundene Zeilen: 0 Warnungen: 0 Dauer von 0 of 1 query: 0,000 sec. */

Es gibt aber entsprechende Zeilen.

Union 13. Mai 2015 17:01

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
Vielleicht geht es so:
Code:
update tabelle
set X=Y
where coalesce(x, '') <> ''

LeisureSuitLarry 13. Mai 2015 17:19

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
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.

jobo 13. Mai 2015 17:27

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

Zitat von LeisureSuitLarry (Beitrag 1301421)
where (coalesce(x, '') <> '') and (coalesce(z, '') <> '')

In dem Fall müssten ja beide Spalten gemeinsam Null sein. Gibt es solche Datensätze?

LeisureSuitLarry 13. Mai 2015 17:29

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
ja, es gibt mehrere Spalten die NULL sein können.

LeisureSuitLarry 13. Mai 2015 17:31

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
Ja, es gibt mehrere Spalten die NULL sind.

sorry, Doppelpost

p80286 13. Mai 2015 22:17

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
SQL-Code:
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

Dejan Vu 14. Mai 2015 06:02

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
feld<>NULL ist ein valider Ausdruck und sollte keine Fehlermeldung ausgeben. :gruebel: <-- 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.

Perlsau 14. Mai 2015 07:27

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

Zitat von LeisureSuitLarry (Beitrag 1301425)
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.

Zitat:

Zitat von Dejan Vu (Beitrag 1301469)
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:

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

hstreicher 14. Mai 2015 07:52

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
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

Perlsau 14. Mai 2015 08:07

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
Ja und? Wenn du nochmal hinschaust, dann erkennst du vielleicht, daß das nichts mit dem Inhalt meines Postings zu tun hat.

Der Titel des Themas lautet übrigens: Mit Feldern verleichen, die NULL sind. Dazu wird hier gegensätzliches behauptet, so z.B.: "feld<>NULL ist ein valider Ausdruck und sollte keine Fehlermeldung ausgeben" im Gegensatz zu "
SQL-Code:
Feld<>Null
sollte eigentlich eine Fehlermeldung produzieren". Das kann man so pauschal nun aber nicht behaupten, weil nicht ganz klar ist, ob nun Delphi oder SQL gemeint ist, denn via SQL funktioniert zwar ein "feld<>NULL", in Delphi dagegen nicht.

Das war aber, wie gesagt, weder Thema noch Inhalt meines Postings, sondern diverse Behauptung meines Vorposters, die ich nicht mit meinen Vorstellungen vereinbaren konnte, was ich mit dem Hinweis, daß ich das nicht verstehe, zum Ausdruck gebracht habe.

Sonst alles klar? Gut geschlafen? Schmeckt der Kaffee? :-D

Dejan Vu 14. Mai 2015 08:40

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

Zitat von Perlsau (Beitrag 1301473)
Zitat:

Zitat von Dejan Vu (Beitrag 1301469)
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 :lol:. 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).

Zitat:

Zitat von Perlsau (Beitrag 1301473)
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:
Delphi-Quellcode:
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.

Perlsau 14. Mai 2015 10:11

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

Zitat von Dejan Vu (Beitrag 1301481)
Zitat:

Zitat von Perlsau (Beitrag 1301473)
Zitat:

Zitat von Dejan Vu (Beitrag 1301469)
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 :lol:. 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.

Du meintest wohl eher: mindestens 1x nachgedacht. Das kann ich so nicht bestätigen, denn Nachdenken ist danach denken. Wenn ich eine Abfrage aller Records, deren Feld Adresse Null ist, benötige, muß ich nicht nachdenken, sondern lediglich Erfahrungswissen abrufen. So schnell kann ich gar nicht denken, wie dieses Wissen verfügbar ist. Das geht quasi automatisch und hat nichts mit Nachdenken zu tun. Nachdenken muß ich erst, wenn ich beim Coden stocke, weil ich erst überlegen – oder eben nachdenken – muß, wie ich das jetzt anstelle.

Ich hab z.B. eine Tabelle, da kriegt der Kunde regelmäßig neue Adressen rein, die sind unvollständig, mal fehlt die Straße, mal die Telefonnummer, mal die Postleitzahl usw. Um das zu ergänzen, kann er sich alle Kunden-Records anzeigen lassen, bei denen die Telefon-Nr. Null ist. Wo soll da ein Problem sein? Die Alternativen wären entweder im Grid alle Kunden-Datensätze durchzublättern, um optisch zu überprüfen, ob da irgendwo was fehlt – nicht sehr komfortabel. Oder die Datensätze zu sortieren und nach ganz oben oder ganz unten zu springen, um die Null-Einträge zu sehen – ein wenig komfortabler, aber nicht optimal.

Zitat:

Zitat von Dejan Vu (Beitrag 1301481)
Speziell bei parametrierten Abfragen wird das dann zu einer sehr unübersichtlichen Angelegenheit:

Wieso geht's jetzt plötzlich um parametrierte Abfragen? Doch nicht um deine Behauptung zu untermauern, oder? Ich finde, in der Pauschalität, in der du häufig argumentierst, übersiehst du meist, daß es noch viel mehr gibt, als auf deinen Teller paßt.

Zitat:

Zitat von Dejan Vu (Beitrag 1301481)
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)

Wieso geht's jetzt plötzlich um Reportfilter?

Zitat:

Zitat von Dejan Vu (Beitrag 1301481)
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'.

Darum geht's doch aber gar nicht ...

Zitat:

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

Und auch darum geht's in diesem Thread nicht.

Hat wenigstens der Kaffee geschmeckt?

LeisureSuitLarry 15. Mai 2015 09:17

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
Danke für Eure Hilfe!

is NULL ist die Lösung.

vagtler 15. Mai 2015 09:21

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

Zitat von LeisureSuitLarry (Beitrag 1301622)
[...] is NULL ist die Lösung.

Na, das ist ja eine Überraschung... http://www.delphipraxis.net/1301406-post3.html

himitsu 15. Mai 2015 09:35

AW: Wie mit Feldern vergleichen, die (NULL) sind
 
Joar,
SQL-Code:
x IS NULL
,
SQL-Code:
x IS NOT NULL
oder
SQL-Code:
NOT (x IS NULL)
schon vor langer Zeit genannt wurden,
in manchen DBMS auch die Abkürzungen
SQL-Code:
x ISNULL
oder
SQL-Code:
x NOTNULL

und im Delphi-Code
Delphi-Quellcode:
x.IsNull
oder
Delphi-Quellcode:
not x.IsNull
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz