In Abfrage "Wenn dann sonst" nach WHERE

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

oerki
*
Beiträge: 15
Registriert: Mo, 16.11.2015 14:16

In Abfrage "Wenn dann sonst" nach WHERE

Beitrag von oerki »

Hallo.

Seit einiger Zeit kämpfe ich mit einem Problem und finde keine Lösung, oder Erklärung.

Ich habe 2 Tabellen.
Eine heißt "Daten" und hat unter anderem die Spalte "Datum".
Die andere heißt "Filter_Zählung" und hat unter anderem die Spalten "F_DatumZw", "F_DatumVon" und F_DatumBis".

In dem Formular sind 2 Datumsfelder und ein Markierfeld (zum Häkchen setzen).

"F_DatumZw" hat so den Wert '0' oder '1' je nach Haken.
"F_DatumVon" und "F_DatumBis" geben eine Zeitspanne an, nach der selektiert werden soll.

In einer Abfrage will ich genau das selektieren.
Also:
WENN Haken nicht gesetzt
DANN sollen nur die Daten angezeigt werden, die in dem Zeitraum liegen
SONST soll das Datum nicht beachtet werden

Bisher klappt das ganz gut:
Haken im Formular wird nicht gesetzt und eine Zeitspanne gewählt.
Dann selektiert mir die folgende Abfrage die Daten und zeigt mir nur die an, die in dem Zeitraum liegen.

Code: Alles auswählen

SELECT * FROM "Daten" WHERE ( SELECT "F_DatumZw" FROM "Filter_Zählung" ) LIKE '0' AND "Datum" BETWEEN ( SELECT "F_DatumVon" FROM "Filter_Zählung" ) AND ( SELECT "F_DatumBis" FROM "Filter_Zählung" )
Wenn ich jetzt aber den Haken setze, dann zeigt er mir leider nicht alle Daten an, sondern gar keine!

Ich möchte aber in diesem Fall alle Daten sehen.

Darum dachte ich so in diese Richtung:

Code: Alles auswählen

SELECT * FROM "Daten" WHERE CASE WHEN( SELECT "F_DatumZw" FROM "Filter_Zählung" ) = '0' THEN "Datum" BETWEEN ( SELECT "F_DatumVon" FROM "Filter_Zählung" ) AND ( SELECT "F_DatumBis" FROM "Filter_Zählung" ) ELSE  NICHTS-MIT-DEM-DATUM-MACHEN  End
Geht das irgendwie, oder kann man meine erste Version so ändern, dass er mir alle Daten anzeigt, wenn der Haken gesetzt ist (also "F_DatumZw" auf '1' steht?

Vielleicht kann mich mal jemand in die richtige Richtung lenken?!

Vielen Dank

Steffen
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: In Abfrage "Wenn dann sonst" nach WHERE

Beitrag von RobertG »

Hallo Steffen,

versuche einmal das Folgende:

Code: Alles auswählen

SELECT * FROM "Daten" WHERE "Datum" BETWEEN IFNULL(( SELECT "F_DatumVon" FROM "Filter_Zählung"  WHERE "F_DatumZw" IS TRUE),"Datum") AND IFNULL(( SELECT "F_DatumBis" FROM "Filter_Zählung"  WHERE "F_DatumZw" IS TRUE ),"Datum")
Gegebenenfalls musst Du noch TRUE auf FALSE ändern, wenn ich das Ansinnen richtig verstanden habe.

Gruß

Robert
oerki
*
Beiträge: 15
Registriert: Mo, 16.11.2015 14:16

Re: In Abfrage "Wenn dann sonst" nach WHERE

Beitrag von oerki »

Hallo.

Leider kommt da:
Syntax error in SQL expression.
Bei SQL Direkt kommt auch ne Fehlermeldung

Steffen
oerki
*
Beiträge: 15
Registriert: Mo, 16.11.2015 14:16

Re: In Abfrage "Wenn dann sonst" nach WHERE

Beitrag von oerki »

Hallo,

warum nicht früher...
Hab es hinbekommen!

Code: Alles auswählen

SELECT * FROM "Daten" WHERE ( SELECT "F_DatumZw" FROM "Filter_Zählung" ) LIKE '1' OR ( SELECT "F_DatumZw" FROM "Filter_Zählung" ) LIKE '0' AND "Datum" BETWEEN ( SELECT "F_DatumVon" FROM "Filter_Zählung" ) AND ( SELECT "F_DatumBis" FROM "Filter_Zählung" )
Ehrlich gesagt weiß ich nicht warum der erste Teil den Unterschied macht, aber es klappt... :D

Anscheinend erkennt der Befehl in welcher Reihenfolge die "AND" und "OR" sind. Kann das sein?

VG

Steffen
oerki
*
Beiträge: 15
Registriert: Mo, 16.11.2015 14:16

Re: In Abfrage "Wenn dann sonst" nach WHERE

Beitrag von oerki »

Da das mit dem Datum ja nicht der Einzige Teil der Abfrage ist bläht sich das jetzt extrem auf und ich sehe schon Gefahr den Überblick zu verlieren...

Es gibt ca. 10 Abfragen, die mit "AND" verknüpft sind.

Wenn ich jetzt das Ganze kombinieren will, dann sieht das so aus:

Code: Alles auswählen

SELECT * FROM "Daten" WHERE

( SELECT "F_DatumZw" FROM "Filter_Zählung" ) LIKE '1' AND ( LOWER ( "Fil" ) LIKE ( SELECT LOWER ( '%' || "F_Fil" || '%' ) FROM "Filter_Zählung" ) OR ( SELECT LOWER ( '%' || "F_Fil" || '%' ) FROM "Filter_Zählung" ) IS NULL )

OR

( SELECT "F_DatumZw" FROM "Filter_Zählung" ) LIKE '0' AND ( LOWER ( "Fil" ) LIKE ( SELECT LOWER ( '%' || "F_Fil" || '%' ) FROM "Filter_Zählung" ) OR ( SELECT LOWER ( '%' || "F_Fil" || '%' ) FROM "Filter_Zählung" ) IS NULL ) AND "Datum" BETWEEN ( SELECT "F_DatumVon" FROM "Filter_Zählung" ) AND ( SELECT "F_DatumBis" FROM "Filter_Zählung" )
Der aktuelle Code ist dann ca. 10 mal länger...

Kann man das irgendwie kürzer und "schöner" machen, ohne dass ich das Ganze doppelt aufschreiben muss?
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: In Abfrage "Wenn dann sonst" nach WHERE

Beitrag von RobertG »

Hallo Steffen,

Du scheinst tatsächlich ein Zahlenfeld und kein Ja/Nein-Feld in der Tabelle zu haben. Dann müsste der Code natürlich entsprechend angepasst sein. Und so wie Du das schreibst ( LIKE '0') könnte es sogar sein, dass Du da für '1' und '0' ein Textfeld nutzt. Warum auch immer ...

Code: Alles auswählen

SELECT * FROM "Daten" WHERE "Datum" BETWEEN IFNULL(( SELECT "F_DatumVon" FROM "Filter_Zählung"  WHERE "F_DatumZw" = '0'),"Datum") AND IFNULL(( SELECT "F_DatumBis" FROM "Filter_Zählung"  WHERE "F_DatumZw" = '0' ),"Datum")
Für weitere Hilfen wäre es sinnvoll, das Beispiel hier (ohne persönliche Daten mit ein paar Dummies) zu posten. Sonst ist das ein Stochern im Nebel.

Gruß

Robert
oerki
*
Beiträge: 15
Registriert: Mo, 16.11.2015 14:16

Re: In Abfrage "Wenn dann sonst" nach WHERE

Beitrag von oerki »

Hallo Robert,

ja das denke ich mir...
Aber ich denke mir reicht das jetzt erstmal soweit. Habe mich von dem "Wenn dann sonst" gelöst und habe das jetzt mit "entweder , oder" gelöst. Funktioniert genauso gut. Ich probiere noch mal ein wenig rum und wenn ich merke ich komme absolut nicht weiter, dann komme ich gerne auf das Angebot zurück.

VG

Steffen
Antworten