DB2: Problem mit if then else in Where Abfrage

davzin

Neuer Benutzer
Beiträge
3
Ich möchte Mitglieder aus einer Personaltabelle auslesen, die in einem bestimmten Zeitraum angestellt waren oder sind. Dazu habe ich folgende Abfrage erstellt.

Code:
SELECT ".$ztbib.".PER.PERNR, ".$ztbib.".PER.PERNAM, ".$ztbib.".PER.PERTEM FROM ".$ztbib.".PER WHERE (".$ztbib.".PER.PEREDA BETWEEN '".$selstart."' AND '".$ende."') OR (".$ztbib.".PER.PERADA BETWEEN '".$selstart."' AND '".$ende."') OR (".$ztbib.".PER.PEREDA <= '".$selstart."' AND IF ".$ztbib.".PER.PERADA = '0' THEN '20991231' ELSE ".$ztbib.".PER.PERADA END AS AUSTRITT >= '".$ende."') ORDER BY ".$ztbib.".PER.PERTEM ASC

Das Problem besteht im letzten Teil der Abfrage.
Wenn im Feld PERADA einen "0" steht, also kein Datum eingetragen ist dann soll er den Wert auf "20991231" stellen und ansonsten den Feldwert beibehalten und dann mit dem übergebenn "Endedatum" auf größer oder gleich vergleichen. Leider bekomme ich da immer eine Fehlermeldung. Ist die Abfrage so gar nicht umsetzbar, oder gibt es eine andre Möglichkeit zu einer Lösung zu kommen?

Danke für Eure Unterstützung
Lg

DavZin
 
Werbung:
Ich möchte Mitglieder aus einer Personaltabelle auslesen, die in einem bestimmten Zeitraum angestellt waren oder sind. Dazu habe ich folgende Abfrage erstellt.

Code:
SELECT ".$ztbib.".PER.PERNR, ".$ztbib.".PER.PERNAM, ".$ztbib.".PER.PERTEM FROM ".$ztbib.".PER WHERE (".$ztbib.".PER.PEREDA BETWEEN '".$selstart."' AND '".$ende."') OR (".$ztbib.".PER.PERADA BETWEEN '".$selstart."' AND '".$ende."') OR (".$ztbib.".PER.PEREDA <= '".$selstart."' AND IF ".$ztbib.".PER.PERADA = '0' THEN '20991231' ELSE ".$ztbib.".PER.PERADA END AS AUSTRITT >= '".$ende."') ORDER BY ".$ztbib.".PER.PERTEM ASC

Das Problem besteht im letzten Teil der Abfrage.
Wenn im Feld PERADA einen "0" steht, also kein Datum eingetragen ist dann soll er den Wert auf "20991231" stellen und ansonsten den Feldwert beibehalten und dann mit dem übergebenn "Endedatum" auf größer oder gleich vergleichen. Leider bekomme ich da immer eine Fehlermeldung. Ist die Abfrage so gar nicht umsetzbar, oder gibt es eine andre Möglichkeit zu einer Lösung zu kommen?

Danke für Eure Unterstützung
Lg

DavZin


Keine Ahnung, was Du für eine DB nutzt, aber du willst ja eine Spalte ausgeben und wenn da eine Bedingung zutrifft einen anderen Wert - Ausgabespalten geheören aber in den Select - Teil, also VOR dem FROM.

Um das mal mit PostgreSQL zu zeigen:

Code:
test=*# select * from foo;
 id | val
----+-----
  1 | 0
  2 | 1
  3 |
  4 | 2
(4 rows)

test=*# select val, case when val is null then 'NULL' else val end as demo, case when val='1' then 'noch eine Demo' else val end from foo;
 val | demo |      val
-----+------+----------------
 0   | 0    | 0
 1   | 1    | noch eine Demo
     | NULL |
 2   | 2    | 2
(4 rows)


Andreas
 
Es ist eine DB2 Datenbank auf einer I-Series.

Ich glaube da liegt ein Missverständnis vor:
Ausgeben möchte ich die Spalten Pernr (Personalnummer), Pernam (Personaname) und Pertem (Personalteam)
Aber nur wenn entweder das
Eintrittsdatum innerhalb des frei wählbaren Zeitbereichs (zwischen $selstart und $ende) liegt oder das
Austrittsdatum (innerhalb des frei wählbaren Zeitbereichs (zwischen $selstart und $ende9 liegt oder
das Eintrittsdatum kleiner als der Startdatum der Selektion ($selstart) und das Austrittsdatum größer als das Selektionsenddatum ($ende) ist.

Wenn der Mitarbeiter noch im Unternehmen ist, also kein Austrittsdatum in der Datenbank angelegt ist, dann steht dort der Wert 0 im Feld Austrittsdatum. Da der Wert Null immer kleiner als ($ende) ist, funktioniert die Selektion nicht entsprechend. Daher soll für den Fall, dass das Austrittsdatum '0' ist dieses mit dem Wert "20991231" erstetzt werden und erst dann mit dem Enddatum verglichen werden.
 
Wenn der Mitarbeiter noch im Unternehmen ist, also kein Austrittsdatum in der Datenbank angelegt ist, dann steht dort der Wert 0 im Feld Austrittsdatum. Da der Wert Null immer kleiner als ($ende) ist, funktioniert die Selektion nicht entsprechend. Daher soll für den Fall, dass das Austrittsdatum '0' ist dieses mit dem Wert "20991231" erstetzt werden und erst dann mit dem Enddatum verglichen werden.


Ahhh.

Mit DB2 kenn ich mich nicht aus, aber in PG würde es (vom Ansatz her) so gehen:

Code:
test=# select * from foo;
 id | val
----+-----
  1 | 0
  2 | 1
  3 |
  4 | 2
(4 rows)

test=*# select * from foo where (case when val is null then 'ja' else val end) = 'ja';
 id | val
----+-----
  3 |
(1 row)


Also wichtig ist das in der Klammer, da müßtest Du den Wert Deiner Spalte da umschreiben.
Ob das so geht - keine Garantie ;-)

Andreas
 
So hats nun geklappt.
Danke für die Hilfe, funktioniert bei DB2 genauso.

Code:
$persql = "SELECT ".$ztbib.".PER.PERNR, ".$ztbib.".PER.PERNAM, ".$ztbib.".PER.PERTEM, ".$ztbib.".PER.PEREDA, ".$ztbib.".PER.PERADA FROM ".$ztbib.".PER WHERE
    (".$ztbib.".PER.PEREDA BETWEEN '".$selstart."' AND '".$ende."' AND ".$ztbib.".PER.PERADA BETWEEN '".$selstart."' AND '".$ende."') OR
    (".$ztbib.".PER.PEREDA <= '".$selstart."' AND ".$ztbib.".PER.PERADA BETWEEN '".$selstart."' AND '".$ende."')  OR
    (".$ztbib.".PER.PEREDA BETWEEN '".$selstart."' AND '".$ende."' AND (CASE WHEN ".$ztbib.".PER.PERADA = 0 THEN '20991231' ELSE ".$ztbib.".PER.PERADA END) >= '".$ende."') OR
    (".$ztbib.".PER.PEREDA <= '".$selstart."' AND (CASE WHEN ".$ztbib.".PER.PERADA = 0 THEN '20991231' ELSE ".$ztbib.".PER.PERADA END) >= '".$ende."')
    ORDER BY ".$ztbib.".PER.PERTEM ASC";

lg
DavZin
 
Werbung:
Zurück
Oben