Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQLITE ifnull komisches verhalten (https://www.delphipraxis.net/192034-sqlite-ifnull-komisches-verhalten.html)

Devil1925 15. Mär 2017 10:42

Datenbank: SQLITE • Version: xxx • Zugriff über: egal

SQLITE ifnull komisches verhalten
 
Liste der Anhänge anzeigen (Anzahl: 3)
Moin, ich habe hier ein äußerst komisches verhalten bei einer SQL Abfrage auf SQLITE:

Die Tabelle auf die die Abfrage läuft:
http://www.delphipraxis.net/attachme...1&d=1489573610

jetzt setze ich folgendes SQL auf die Tablle ab:
Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value from INITAB) T on T.Keyname = I.Abhaengig
where T.Value = 1
Ergebnis:
http://www.delphipraxis.net/attachme...1&d=1489573870

Soweit so gut. jetzt möchte ich aber alle Zeilen als ergebnis haben, in welchen die spalte
Delphi-Quellcode:
T.Value
entweder '1' oder NULL ist. Logische schlussfolgerung: ein
Delphi-Quellcode:
ifnull
verwenden!

Also ein
Delphi-Quellcode:
ifnull
drum gesetzt:
Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value from INITAB) T on T.Keyname = I.Abhaengig
where ifnull(T.Value, 1) = 1
Ergebnis:
http://www.delphipraxis.net/attachme...1&d=1489574293

Jetzt meine Frage: wo ist die Zeile "MailMonate" hin? habe ich ifnull irgendwie falsch verstanden? In meinem Wissensstand macht ifnull bei einer Spalte aus allen Feldern, in welchen NULL steht den angegebenen Wert und ansonsten gibt es den vorhandenen Wert zurück. dementsprechend müsste hier doch auch die "MailMonate" Zeile mit kommen oder?

jobo 15. Mär 2017 11:22

AW: SQLITE ifnull komisches verhalten
 
kann sein dass das ein Typproblem ist. mach mal auf die andere Seite auch ifnull(1,1) zum Test

nahpets 15. Mär 2017 11:23

AW: SQLITE ifnull komisches verhalten
 
Naja, da der Wert von Value = 6 ist und Du auf Value = 1 abfragst, dürfte das Ergebnis schon stimmen.

Aufgrund Deiner Frage und der Darstellungen in den Bildern hätte ich dieses SQL erwartet:
SQL-Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value from INITAB) T on T.Keyname = I.Abhaengig
where ifnull(T.Value1, 1) = 1

Ghostwalker 15. Mär 2017 11:31

AW: SQLITE ifnull komisches verhalten
 
Nein, eigentlich nicht. Auch die Doku dazu https://www.techonthenet.com/sqlite/...ons/ifnull.php sagt das gleiche.

Eigentlich sollten beide Abfragen das gleiche Ergebnis bringen, da die Spalte Value nie NULL ist,
von daher wär das mit ifnull eh überflüssig.

mkinzler 15. Mär 2017 11:44

AW: SQLITE ifnull komisches verhalten
 
Versuche es mal mit
SQL-Code:
...where coalesce( TValue1,1) = 1;

Ghostwalker 15. Mär 2017 11:54

AW: SQLITE ifnull komisches verhalten
 
Ich würds mal so probieren:

Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value from INITAB) T on T.Keyname = I.Abhaengig
where (T.Value = 1) OR ISNULL(T.Value);

nahpets 15. Mär 2017 11:54

AW: SQLITE ifnull komisches verhalten
 
Zitat:

Zitat von mkinzler (Beitrag 1364262)
Versuche es mal mit
SQL-Code:
...where coalesce( TValue1,1) = 1;

Vor allem, die Abfrage erstmal auf T.Value1 ändern. Solange ich eine Spalte abfrage, die nicht den abzufragenden Wert enthält, bekomme ich auch nicht das gewünschte Ergebnis. Hier den Fehler dann irgendwo in den Datenbankfunktionen zu suchen, oder eine Funktion durch eine andere zu ersetzen, bringt nichts.

Der gesuchte Tabelleneintrag enthält in der Spalte Value den Wert 6. Wenn ich da auf 1 Abfrage, werde ich ihn nicht in der Ergebnismenge erhalten, auch dann nicht, wenn ich ihn vorher auf Null prüfe und für den Fall, dass er Null sein sollte durch 1 ersetze.

6 ist nicht Null und wird daher durch ein IfNull(6,1) auch nicht zu 1.

Devil1925 15. Mär 2017 12:40

AW: SQLITE ifnull komisches verhalten
 
Ich habe jetzt noch nicht verstanden wie ihr auf
Delphi-Quellcode:
T.Value1
kommt? ich möchte auf den Value Wert aus der Unterabfrage aus dem
Delphi-Quellcode:
LEFT JOIN
abfragen, und die Spalte heisst doch
Delphi-Quellcode:
Value
Zitat:

Zitat von nahpets (Beitrag 1364257)
Naja, da der Wert von Value = 6 ist und Du auf Value = 1 abfragst, dürfte das Ergebnis schon stimmen.

Wäre das der Value Wert den ich Abfrage würde das ja auch korrekt laufen, allerdings ist
Delphi-Quellcode:
 I.Value
6 und ich frage
Delphi-Quellcode:
T.Value
ab, welcher in diesem Fall 1 ist und dementsprechend mit selektiert werden müsste.

Zitat:

Zitat von mkinzler (Beitrag 1364262)
Versuche es mal mit
SQL-Code:
...where coalesce( TValue1,1) = 1;

auch diese Abfrage gibt mir nicht die Gewünschten Werte zurück. Wobei es eben die Spalte
SQL-Code:
TValue1
nicht gibt sondern nur die Spalte
SQL-Code:
T.Value
.

Zitat:

Zitat von nahpets (Beitrag 1364264)
Zitat:

Zitat von mkinzler (Beitrag 1364262)
Versuche es mal mit
SQL-Code:
...where coalesce( TValue1,1) = 1;

Vor allem, die Abfrage erstmal auf T.Value1 ändern. Solange ich eine Spalte abfrage, die nicht den abzufragenden Wert enthält, bekomme ich auch nicht das gewünschte Ergebnis. Hier den Fehler dann irgendwo in den Datenbankfunktionen zu suchen, oder eine Funktion durch eine andere zu ersetzen, bringt nichts.

Wie schon gesagt, wie kommst du darauf dass ich das auf "T.Value1" ändern soll? diese Spalte gibt es doch garnicht? Ausserdem dürfte doch wenn das so läuft wie du es gerade meinst doch auch nur "KontaktSub" und "Mail" anzeigen, allerdings wird mehr angezeigt.

Devil1925 15. Mär 2017 13:00

AW: SQLITE ifnull komisches verhalten
 
Ich habe es jetzt gelöst indem ich als Abfrage nicht
SQL-Code:
... where ifnull(T.Value, 1) = 1
verwende sondern
SQL-Code:
 ...where (T.Value = 1 or T.Value is NULL)
. Dies liefert das gewünschte Ergebnis. Aber sollten nicht beide Abfragen das korrekte Ergebnis Liefern?

mkinzler 15. Mär 2017 13:04

AW: SQLITE ifnull komisches verhalten
 
In der Ergebnismege (JOIN) ist das Feld Value 2 Mal enthalten. Über diese Tatsache stolpert Deine Abfrage.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 Uhr.
Seite 1 von 3  1 23      

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