AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQLITE ifnull komisches verhalten

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 2  1 2   
Ghostwalker

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

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.876 Beiträge
 
Delphi 11 Alexandria
 
#2

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
 
#3

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
 
#4

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
 
#5

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
 
#6

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.876 Beiträge
 
Delphi 11 Alexandria
 
#7

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
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, 13:10
Habe die Abfrage jetzt gerade mal angepasst:

SQL-Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Abhaengig_Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value as Abhaengig_Value from INITAB) T on T.Keyname = I.Abhaengig
where ifnull(T.Abhaengig_Value, 1) = 1
Trotzdem bekomme ich noch immer nicht die gewünschten ergebnisse...
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 13:20
Ok, die Screenshots sind nicht die Tabellen, sondern die Ergebnisse mit nicht zwingend verständlichen Namen.

Die Spaltenüberschrift Value1 hatte ich als Namen der Spalte Value1 verstanden.

Es ist aber wohl die von SQLite vorgenommene Nummerierung von nicht eindeutigen Spaltennamen in der Ergebnismenge.

Danke für die Verwirrung.

Wo finde ich denn jetzt eigentlich die Tabellendefinition von INITAB, um da etwas eindeutigere Informationen zu bekommen, statt der Spalten der nicht zufriedenstellenden Abfrageversuche?

Dashier
SQL-Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Abhaengig_Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value from INITAB) T on T.Keyname = I.Abhaengig
where ifnull(T.Value, 1) = 1
würde ich auch anders formulieren:
SQL-Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Value As Abhaengig_Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value from INITAB where ifnull(Value, 1) = 1) T on T.Keyname = I.Abhaengig
Warum die Einschränkung für die Teilmenge im Left-Join ausserhalb des Unterselects? Das führt beim Lesen (und eventuell auch bei der Interpretation durch die Datenbank?) sehr schnell zu Verwirrung.

Bau Dir bitte mal für dasda (Select Sectionname, Keyname, Value from INITAB where ifnull(Value, 1) = 1) 'ne View und binde die, nachdem ihre Ergebnisse als richtig verifiziert wurden, ins Left Join ein.
Eventuell wird dann die Abfragelogik leichter les- und verstehbar.
  Mit Zitat antworten Zitat
Benutzerbild von Devil1925
Devil1925

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

AW: SQLITE ifnull komisches verhalten

  Alt 15. Mär 2017, 13:41
Ok, die Screenshots sind nicht die Tabellen, sondern die Ergebnisse mit nicht zwingend verständlichen Namen.

Die Spaltenüberschrift Value1 hatte ich als Namen der Spalte Value1 verstanden.

Es ist aber wohl die von SQLite vorgenommene Nummerierung von nicht eindeutigen Spaltennamen in der Ergebnismenge.

Danke für die Verwirrung.
Entschuldigung für die Verwirrung durch das erste Bild.

Wo finde ich denn jetzt eigentlich die Tabellendefinition von INITAB, um da etwas eindeutigere Informationen zu bekommen, statt der Spalten der nicht zufriedenstellenden Abfrageversuche?
Hier einmal die genaue Tabellendefinition:
Tabelle: INITAB
Spalten:
Sectionname VARCAHR
Keyname VARCHAR
Value VARCHAR
Abhaengig VARCHAR

Dashier
SQL-Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Abhaengig_Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value from INITAB) T on T.Keyname = I.Abhaengig
where ifnull(T.Value, 1) = 1
würde ich auch anders formulieren:
SQL-Code:
Select I.Keyname, I.Value, I.Abhaengig, T.Value As Abhaengig_Value from INITAB I
LEFT JOIN (Select Sectionname, Keyname, Value from INITAB where ifnull(Value, 1) = 1) T on T.Keyname = I.Abhaengig
Warum die Einschränkung für die Teilmenge im Left-Join ausserhalb des Unterselects? Das führt beim Lesen (und eventuell auch bei der Interpretation durch die Datenbank?) sehr schnell zu Verwirrung.
Es geht ja darum, dass ich in der endabfrage sowohl die Datensätze haben möchte, welche im Value der unterabfrage eine 1 stehen haben, als auch die, welche keinen Datensatz in der Unterabfrage zugeordnet haben. Somit brauche ich aus der Gesamtabfrage alle Datensätze die in der Spalte (so in der Abfrage benannt) "Abhaengig_Value" entweder NULL oder 1 stehen haben.

Bau Dir bitte mal für dasda (Select Sectionname, Keyname, Value from INITAB where ifnull(Value, 1) = 1) 'ne View und binde die, nachdem ihre Ergebnisse als richtig verifiziert wurden, ins Left Join ein.
Eventuell wird dann die Abfragelogik leichter les- und verstehbar.
man kann in SQLITE Views einbauen? das ist mir neu, kann aber auch sein das ich das einfach noch nicht wusste.
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 07:30 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