![]() |
Datenbank: SQLite • Version: 3? • Zugriff über: TSQLDataSet
IIF mit SQLite
Hallo,
ich habe eine SQLite-Datenbank. Über ein SQL in TSQLDataSet erstelle ich eine Abfrage. Abhängig vom Inhalt eines Feldes soll entweder der Inhalt eines Feldes oder die Kombination zweiter Felder in einem DBEdit-Feld angezeigt werden.
Code:
Leider wird beim Aktivieren von TSQLDataSet eine Exception "TDBXError" ausgeworfen. In dem Datenbank-Tool "SQLite Expert Personal" funktioniert das SQL-Statement fehlerfrei. Es scheint so, dass TSQLDataSet "IIF" (habe es auch schon nur mit "IF" versucht) nicht versteht. Ich würde aber gerne das Ganze über ein SQL-Statement steuern und nicht noch explizit Code in Delphi schreiben.
SELECT R.Titel AS Titel,
R.Bild AS Bild, R.Zubereitung AS Zubereitung, R.Bemerkungen AS Bemerkungen, IIF(RU.UnterbereichName='',RB.BereichName,RB.BereichName||" - "||RU.UnterbereichName) AS Bereich FROM REZEPTE AS R LEFT JOIN RezeptBereich AS RB on (RB.RKategorieID=R.RKatergorieID) LEFT JOIN RezeptUnterbereich AS RU ON (RU.RUKategorieID=R.RUKategorieID) WHERE R.RezeptID=1 Vielleicht hat jemand eine Idee oder das richtige Wissen. |
AW: IIF mit SQLite
Hallo,
gerade habe ich auch noch festgestellt, dass "AS Bereich" auch nicht erkannt wird. Gib es irgendwo eine Beschreibung, welchen SQL-Befehle die Delphi-Komponente TSQLDataSet versteht? |
AW: IIF mit SQLite
Hast Du es mal mit einem CASE versucht?
SQL-Code:
(CASE WHEN RU.UnterbereichName=''
THEN RB.BereichName ELSE RB.BereichName||' - '||RU.UnterbereichName END) AS Bereich |
AW: IIF mit SQLite
Tippe mal darauf, dass das Problem eher bei den '' liegt:
Mach mal spasseshalber aus den '' einfach '''', dann könnte es klappen. Da wir nicht wissen, wie Du im Delphiquelltext das SQL übergibst, können wir nur raten, ob hier ein ''-Problem vorliegen kann. Bei einer Stringzuweisung in der Form
Delphi-Quellcode:
sql.text := 'select IIF(RU.UnterbereichName='',RB.BereichName,RB.BereichName||" - "||RU.UnterbereichName) AS Bereich';
muss es
Delphi-Quellcode:
sql.text := 'select IIF(RU.UnterbereichName='''',RB.BereichName,RB.BereichName||" - "||RU.UnterbereichName) AS Bereich from tabelle';
heißen. Ein einzelnes ' führt in Delphi zu einem Fehler, weil bei den ' für den String irgendwas nicht stimmt. Mit '' ist dieser Fehler weg, da dann der String letztlich ein ' enthält. Für das SQL ist das aber ein ' zu wenig, was zum Fehler bei As Bereich führt. |
AW: IIF mit SQLite
Doppelte Anführungszeichen anstatt einfachen hat nicht geholfen.
"... wie Du im Delphiquelltext das SQL übergibst ...": Ich gebe den SQL direkt in der Property "CommandText" der Komponente ein. "CASE ..." Hier kommt nun nicht der TDBXError. Anscheinend akzeptiert die Komponente den CASE-Befehl. Jedoch - wie in meinem 2. Kommentar erwähnt - kann TSQLDataSet mit "AS" nichts anfangen. Daher führt der CASE-Befehl mit abschliessendem "AS Bereich" bei der DBEdit-Komponente zu der Fehlermeldung "Das Feld 'Bereich' wurde nicht gefunden". |
AW: IIF mit SQLite
Der Fehler tritt auf, weil bei den '' ein Problem auftritt.
Schön, dass Du das SQL der Property CommandText übergibst. Zeig' doch einfach mal den entsprechenden Delphi-Quelltext, dann kann man sehen, ob es da eventuell hakt. Da der Fehler bei "AS Bereich" auftritt, die "AS ..." davor aber nicht bemängelt werden, muss der Fehler irgendwo zwischen "AS Bemerkungen" und "AS Bereich" liegen. Da könnte dann eventuell auch noch das ||" - "|| ein Problem darstellen. Ändere bitte die Zeile (auch wenn es das SQL erstmal verfälscht) in
SQL-Code:
IIF(RU.UnterbereichName is null,RB.BereichName,RB.BereichName||RU.UnterbereichName) AS Bereich
Ist der Fehler dann weg? Dann gibt es ein Problem bei der Übergabe der Zeichenfolgen an die Datenbank. |
AW: IIF mit SQLite
Schade, dass Sqlite kein CONCAT kennt, so wie nahezu jedes andere ordentliche DBMS.
SQL-Code:
concat_ws(" - ", BereichName, UnterbereichName) AS Bereich
aber als Alternatove geht es auch so
SQL-Code:
BereichName || coalesce(UnterbereichName||" - ", "") AS Bereich
[EDIT] neee, das trifft nur zu, wenn es NULL und nicht '' ist :oops: Ist UnterbereichName wirklich '' oder vielleicht doch NULL. aus '' mach NULL (falls noch nicht) und dann
SQL-Code:
concat_ws(" - ", BereichName, nullif(UnterbereichName,"")) AS Bereich
aber als Alternatove geht es auch so
SQL-Code:
BereichName || coalesce(nullif(UnterbereichName,"")||" - ", "") AS Bereich
|
AW: IIF mit SQLite
Zitat:
"IIF(RU.UnterbereichName is null,RB.BereichName,RB.BereichName||RU.Unterbereic hName) AS Bereich" hat leider keine Änderung bewirkt. Delphi kommt noch immer mit einem TDBXError :(. Zitat:
Mit der Aktivierung von TSQLDataSet wirft Delphi bei "IIF" die Exception "TDBXError". Mit "CASE" ist dies nicht mehr der Fall. Somit ist CASE die Alternative zu IIF - auch wenn mir IFF sympathischer wäre. Nach der Aktivierung von TSQLDataSet weist Delphi den DB-Komponenten die Felder zu. Hier kommt es zu einem Fehler bei "AS Bereich". Ich habe den "AS-Fehler" auch schon durch folgenden Code getestet:
Code:
Hier kommt Delphi mit dem Fehler "Das Feld 'Titel2' wurde nicht gefunden".
SELECT R.Titel AS Titel2 FROM REZEPTE AS R
|
AW: IIF mit SQLite
Zitat:
Code:
geht?
SELECT R.Titel AS Titel2 FROM REZEPTE R
Btw. "TSQLDataSet" ist noch dbExpress, nicht FireDAC. Da kanns sein, dass die verwendete SQLite Version unglaublich alt ist und viele Konstrukte einfach nicht versteht. Edit: das verwendete Tool "SQLite Expert Personal" verwendet seine eigene SQLite DLL. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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 by Thomas Breitkreuz