![]() |
AW: SQLITE ifnull komisches verhalten
Habe die Abfrage jetzt gerade mal angepasst:
SQL-Code:
Trotzdem bekomme ich noch immer nicht die gewünschten ergebnisse...
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 |
AW: SQLITE ifnull komisches verhalten
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:
würde ich auch anders formulieren:
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
SQL-Code:
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.
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 Bau Dir bitte mal für dasda
SQL-Code:
'ne View und binde die, nachdem ihre Ergebnisse als richtig verifiziert wurden, ins Left Join ein.
(Select Sectionname, Keyname, Value from INITAB where ifnull(Value, 1) = 1)
Eventuell wird dann die Abfragelogik leichter les- und verstehbar. |
AW: SQLITE ifnull komisches verhalten
Zitat:
Zitat:
Tabelle: INITAB Spalten: Sectionname VARCAHR Keyname VARCHAR Value VARCHAR Abhaengig VARCHAR Zitat:
Zitat:
|
AW: SQLITE ifnull komisches verhalten
Keine Ahnung, ob SQLite Views kann, würd' es aber zumindest mal probieren.
Siehe ![]() Value ist VarChar, Du fragst aber auf nummerisch ab. Ist ein leeres Value nun Null oder ein Leerstring? Bitte mal noch ein Select * from INITAB als Screenshot, damit man das auch mal sehen kann. Bei Value = VarChar wäre die Mindeständerung:
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 |
AW: SQLITE ifnull komisches verhalten
Zitat:
![]() |
AW: SQLITE ifnull komisches verhalten
Danke, der Denkanstoß fehlte mir! Durch das Ändern von [CODE=SQL]... where ifnull(T.Value, 1) = 1[CODE] auf
SQL-Code:
funktioniert das auch!
... where ifnull(T.Value, '1') = '1'
(mich wundert es nur, dass da kein Fehler ausgeworfen wurde und der die Abfrage einfach ausgeführt hat, aber vielleicht bin ich da auch einfach vom MSSQL Managementstudio verwöhnt) |
AW: SQLITE ifnull komisches verhalten
Zitat:
|
AW: SQLITE ifnull komisches verhalten
Zitat:
SQLite ist nicht pingelig mit Typen. Der Typ des Ausdrucks "ifnull(<feld>,1)" ist (mir) erstmal unbekannt. Genaugenommen wohl auch sqlite, da die Funktion verschiedenste Spaltentypen als Eingangsparameter schluckt. Um sicherzugehen, dass ein Vergleich mit festem Typ funktioniert, muss man die gewünschten Typen auch gesichert herbeiführen. Also Cast oder sowas. Hast Du gemacht mit Anführungszeichen. (Ich wäre mir übrigens nicht sicher, dass Deine Methode hinreichend sicher ist) Mein Vorschlag, am anderen Ende des "=" die gleiche Funktion einzusetzen, nur mit fixen Parametern, war ein erster Wurf, um Dich auf das Problem aufmerksam zu machen. P.S.: Auch in anderen RDBMS gibt es solche Funktionen, deren Ausgabetyp notgedrungen (oder eleganter Weise) variieren kann. Das wird dynamisch zum Zeitpunkt des Aufrufs bestimmt und ist idR auch dokumentiert, wie die Funktionen das machen. Also an der Ecke schadet es nie, 2x hinzusehen. |
AW: SQLITE ifnull komisches verhalten
Also da muss ich jetzt mal was loswerden!
Wieso scheren sich Entwickler, die bei Delphi die Typsicherheit loben (aber durchaus auch andere), bei der Nutzung von SQL 'nen Teufel um die Datentypen? Da wird verglichen auf teufelkommraus, aber mal links und rechts des Gleichheitszeichens den gleichen Datentyp verwenden? Warum, solange es nicht knallt, wird es wohl schon gehen. Und wenn nicht: Erst ist es mal ein Probelm der Datenbank und deren fehlerhaften Funktionen. Übrigens ein Problem, dass ich schon meine ganze Zeit als Entwickler immer und immerwieder beobachten durfte, ist also nix persönliches oder explizites hier in diesem Thread oder Forum. Nur ganz allgemein und extrem nervend. Man sucht Fehler in 'ner Datenbank und deren Implementierung. Kaum achtet man mal auf den Datentyp, schon hat sich das Problem in Luft aufgelöst. Vermutlich ist das größte Problem bei der Nutzung von SQL, dass es bei unterschiedlichen Datentypen extrem fehlertolerant ist, aber diese Fehlertoleranz nicht immer im Sinne der Wünsche der Nutzer erfolgt, sondern im Sinne der technischen Implementierung der Datenbank. Oder kurz: Wenn ich Zeichenfolgen zu vergleichen habe, dann vergleiche ich Zeichenfolgen. Wenn ich nummerische Werte zu vergleichen habe, dann vergleiche ich nummerische Werte. Muss ich das Eine mit dem Anderen vergleichen, dann nutze ich die entsprechend Typkonvertierung und verlasse mich nicht darauf, dass die Datenbank selbständige die Typkonvertierung nutzt, von der ich meine, dass sie im konkreten Fall die Richtige sei. Das kann funktionieren, muss aber nicht. Und der Fehler liegt dann nicht in der Datenbank, sondern sitzt davor. So, genug gemeckert ;-) |
AW: SQLITE ifnull komisches verhalten
Zur Kenntnis genommen!
Zitat:
Und damit noch einen schönen Start in den Feierabend :cheers: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 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