AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

IIF mit SQLite

Ein Thema von ThomasWB · begonnen am 6. Jun 2022 · letzter Beitrag vom 7. Jun 2022
Antwort Antwort
ThomasWB

Registriert seit: 21. Jun 2015
38 Beiträge
 
#1

IIF mit SQLite

  Alt 6. Jun 2022, 16:11
Datenbank: SQLite • Version: 3? • Zugriff über: TSQLDataSet
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:
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
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.
Vielleicht hat jemand eine Idee oder das richtige Wissen.
  Mit Zitat antworten Zitat
ThomasWB

Registriert seit: 21. Jun 2015
38 Beiträge
 
#2

AW: IIF mit SQLite

  Alt 6. Jun 2022, 16:17
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#3

AW: IIF mit SQLite

  Alt 6. Jun 2022, 16:17
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.554 Beiträge
 
Delphi 7 Professional
 
#4

AW: IIF mit SQLite

  Alt 6. Jun 2022, 17:17
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

sql.text := 'select IIF(RU.UnterbereichName='',RB.BereichName,RB.BereichName||" - "||RU.UnterbereichName) AS Bereich';

muss es

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.
  Mit Zitat antworten Zitat
ThomasWB

Registriert seit: 21. Jun 2015
38 Beiträge
 
#5

AW: IIF mit SQLite

  Alt 6. Jun 2022, 17:43
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".
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.554 Beiträge
 
Delphi 7 Professional
 
#6

AW: IIF mit SQLite

  Alt 6. Jun 2022, 18:47
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#7

AW: IIF mit SQLite

  Alt 6. Jun 2022, 19:05
Schade, dass Sqlite kein CONCAT kennt, so wie nahezu jedes andere ordentliche DBMS.
concat_ws(" - ", BereichName, UnterbereichName) AS Bereich

aber als Alternatove geht es auch so
BereichName || coalesce(UnterbereichName||" - ", "") AS Bereich


[EDIT]
neee, das trifft nur zu, wenn es NULL und nicht '' ist


Ist UnterbereichName wirklich '' oder vielleicht doch NULL.


aus '' mach NULL (falls noch nicht) und dann
concat_ws(" - ", BereichName, nullif(UnterbereichName,"")) AS Bereich

aber als Alternatove geht es auch so
BereichName || coalesce(nullif(UnterbereichName,"")||" - ", "") AS Bereich
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 6. Jun 2022 um 19:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

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 23:13 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