AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQLITE ifnull komisches verhalten
Thema durchsuchen
Ansicht
Themen-Optionen

SQLITE ifnull komisches verhalten

Ein Thema von Devil1925 · begonnen am 15. Mär 2017 · letzter Beitrag vom 15. Mär 2017
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#1

SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 10:42
Datenbank: SQLITE • Version: xxx • Zugriff über: egal
Moin, ich habe hier ein äußerst komisches verhalten bei einer SQL Abfrage auf SQLITE:

Die Tabelle auf die die Abfrage läuft:


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:


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

Also ein 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:


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?
Miniaturansicht angehängter Grafiken
grundtabelle.png   abfrage1.png   komischesergebnis.png  
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.
  Mit Zitat antworten Zitat
jobo

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

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 11:22
kann sein dass das ein Typproblem ist. mach mal auf die andere Seite auch ifnull(1,1) zum Test
Gruß, Jo
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 11:23
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
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 11:31
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.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 11:44
Versuche es mal mit ...where coalesce( TValue1,1) = 1;
Markus Kinzler
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 11:54
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);
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 11:54
Versuche es mal mit ...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.
  Mit Zitat antworten Zitat
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 12:40
Ich habe jetzt noch nicht verstanden wie ihr auf T.Value1 kommt? ich möchte auf den Value Wert aus der Unterabfrage aus dem LEFT JOIN abfragen, und die Spalte heisst doch Value
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  I.Value 6 und ich frage T.Value ab, welcher in diesem Fall 1 ist und dementsprechend mit selektiert werden müsste.

Versuche es mal mit ...where coalesce( TValue1,1) = 1;
auch diese Abfrage gibt mir nicht die Gewünschten Werte zurück. Wobei es eben die Spalte TValue1 nicht gibt sondern nur die Spalte T.Value .

Versuche es mal mit ...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.
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.

Geändert von Devil1925 (15. Mär 2017 um 12:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 13:00
Ich habe es jetzt gelöst indem ich als Abfrage nicht ... where ifnull(T.Value, 1) = 1 verwende sondern  ...where (T.Value = 1 or T.Value is NULL) . Dies liefert das gewünschte Ergebnis. Aber sollten nicht beide Abfragen das korrekte Ergebnis Liefern?
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 13:04
In der Ergebnismege (JOIN) ist das Feld Value 2 Mal enthalten. Über diese Tatsache stolpert Deine Abfrage.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 22:54 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