Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wenn Feld null oder 0 einen anderen Wert zurückgeben (https://www.delphipraxis.net/182694-wenn-feld-null-oder-0-einen-anderen-wert-zurueckgeben.html)

DelTurbo 11. Nov 2014 11:16

Datenbank: MySql • Version: 5.x • Zugriff über: UniDac

Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
Hallo,
irgendwie bekomme ich es nicht hin, die IF-Abfrage richtig zu machen. Bei x.FIDPtr können 3 Werte kommen. Entweder null,0 oder halt eine Zahl welcher der Pointer ist.

Ist x.FIDPtr null bekomme ich nur leere Felder zurück. Deswegen habe ich nun in der Tabelle ein Leerfeld angelegt. Mit null klappt es auch. Aber nicht mit 0. Die abfrage sieht so aus:

Code:
SELECT X.ID,X.Vorname,X.Nachname,Y.Funktion FROM ADaten as x
INNER JOIN FDaten as y on (y.ID=IFNULL(x.FIDPtr,53))
WHERE X.ID=3964;
Ich müsste wenn x.FIDPtr 0 ist, eine 53 haben. Bekomme es aber einfach nicht hin.

Gruß und danke im voraus

mkinzler 11. Nov 2014 11:26

AW: If then else
 
Beim Inner Join gibt es die Datensätze mit NULL nicht mehr

p80286 11. Nov 2014 11:30

AW: If then else
 
NULL und 0 ist nicht das gleiche!
Kennt MySql
SQL-Code:
decode
?
dann mach es so
Code:
select decode(x.FIDPtr,null,' ',0,'53',x.FIDPtr)
und der Join sollte doch wohl über die ID gehen?

Gruß
K-H

DelTurbo 11. Nov 2014 11:33

AW: If then else
 
Das habe ich schon gemerkt. Aber wie bekomme ich die 53 zurück?

Mit dieser Abfrage klappt es auch nicht. Ich habe das schon sehr viel versucht. Aber komme an dieser stelle nicht weiter.

Code:
INNER JOIN FDaten as y on (y.ID=IFNULL(x.FIDPtr,53)) OR IF(x.FIDPtr=0,53,xFIDPtr)

DelTurbo 11. Nov 2014 11:43

AW: If then else
 
Erstmal sorry, habe wohl getippt und deine Antwort nicht direkt gesehen.

Decode ist bei MySql wohl was anderes. Die abfrage klappt leider nicht.

Code:
SELECT X.ID,X.Vorname,X.Nachname,Y.Funktion FROM ADaten as x
 INNER JOIN FDaten as y on (y.ID=select decode(x.FIDPtr,null,' ',0,'53',x.FIDPtr))
 WHERE X.ID=3964;
Weder mit SELECT noch ohne.

Fehler: [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'null,' ',0,'53',FDaten.FIDPtr))

Medium 11. Nov 2014 12:07

AW: If then else
 
Ich sehe hier nirgends eine if-then-else Abfrage, nur SQL Statements. Wie genau sehen deine Ausgangsdaten aus, und was willst du am Ende wirklich haben?

Zwei "Glaskugel"-Ideen-Ansätze: Wenn du auch null-Felder im Join brauchst, nimm FULL OUTER JOIN. Wenn das Problem nicht im SQL sondern eher in Delphi liegt (was der Threadtitel irgendwie suggeriert): Praktisch alle DB-Komponenten nutzen Delphis TField, welches wiederum eine Property "IsNull" bietet. Damit lassen sich auch in Delphi 0 und NULL unterscheiden.

Um aber wirklich konkret zu werden, ist mir das hier alles zu konfus. Sortier dich erstmal selbst :)

baumina 11. Nov 2014 12:14

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
Ich hätte noch ne Orakel-Lösung :-D

SQL-Code:
SELECT X.ID,X.Vorname,X.Nachname,Y.Funktion FROM ADaten as x
 INNER JOIN FDaten as y on (y.ID=x.FIDPtr)
 WHERE X.ID=3964;

DelTurbo 11. Nov 2014 12:15

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
Topic ist geändert. Besser kann ich das nicht beschreiben.

Also, ich habe 2 Tabellen. Einmal mit Namen und einen Pointer auf die ID der zweiten Tabelle. Wenn der Pointer richtig gesetzt ist, klappt alles. Wenn nix drin steht, also der Pointer null ist, dann gebe ich mir eine 53 zurück. Leider kann diese "Pointerfeld" auch den 0 haben. Dann brauch ich auch die 53. Und das bekomme ich nicht hin. Das null nicht gleich 0 ist weiß ich. Sonst würde es ja klappen. ;)

Ich hoffe das war verständlich. Wenn nicht, einfach nochmal fragen.

Gruß

DelTurbo 11. Nov 2014 12:21

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
Zitat:

Zitat von baumina (Beitrag 1279372)
Ich hätte noch ne Orakel-Lösung :-D

SQL-Code:
SELECT X.ID,X.Vorname,X.Nachname,Y.Funktion FROM ADaten as x
 INNER JOIN FDaten as y on (y.ID=x.FIDPtr)
 WHERE X.ID=3964;

Uff, das klappt. Vielen vielen Dank!!!

baumina 11. Nov 2014 12:28

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
Vielleicht so, wobei mir deine Datenstruktur sehr seltsam vorkommt:

SQL-Code:
SELECT X.ID,X.Vorname,X.Nachname,Y.Funktion FROM ADaten as x
  LEFT JOIN FDaten as y on (y.ID=If(coalesce(x.FIDPtr,53)=0,53,coalesce(x.FIDPtr,53)))
  WHERE X.ID=3964;
EDIT: Aber wenn das andere geklappt hat, dann war deine "was brauche ich" Beschreibung sehr seltsam *lach

DeddyH 11. Nov 2014 12:36

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
Ich hätte so etwas versucht (ungetestet):
SQL-Code:
SELECT
  X.ID,X.Vorname,X.Nachname,Y.Funktion FROM ADaten AS x
JOIN
  FDaten AS y ON y.ID = (IF(x.FIDPtr = 0, 53, IFNULL(x.FIDPtr, 53)))
WHERE
  X.ID=3964;

baumina 11. Nov 2014 12:42

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
So wie ich das aber jetzt verstanden habe, ist die 53 nicht allgemeingültig, sondern bezieht sich ausschließlich auf die X.ID=3964

DeddyH 11. Nov 2014 13:12

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
Ich habe es so verstanden, dass bei NULL oder 0 immer die 53 kommen soll.

DelTurbo 11. Nov 2014 13:33

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
Zitat:

Zitat von DeddyH (Beitrag 1279384)
Ich habe es so verstanden, dass bei NULL oder 0 immer die 53 kommen soll.

Genau so. Aber wie gesagt, es klappt.

Vielen dank an alle

EDIT: Und sorry wenn ich mich etwas unglücklich ausgedrückt habe.

Sir Rufo 11. Nov 2014 14:35

AW: Wenn Feld null oder 0 einen anderen Wert zurückgeben
 
SQL-Code:
SELECT IFNULL( foo, 0 );
SELECT COALESCE( foo, 0 );
Beide liefern folgendes zurück
fooResult
NULL0
00
11
......
Davon abgeleitet ergibt
SQL-Code:
SELECT
  CASE IFNULL( foo, 0 )
    WHEN 0 THEN 53 
  ELSE foo END;
folgendes Ergebnis
fooResult
NULL53
053
11
......
SQLFiddle Demo


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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