Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

DB2: Problem mit if then else in Where Abfrage

Dieses Thema im Forum "DB2" wurde erstellt von davzin, 26 Februar 2013.

  1. davzin

    davzin Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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
     
  3. davzin

    davzin Neuer Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru


    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
     
  5. davzin

    davzin Neuer Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Supi, Danke für die Rückinfo.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden