Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Oracle: CASE WHEN ... IN ()

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.05.2006
    Beiträge
    63

    Oracle: CASE WHEN ... IN ()

    Hallo,

    ich möchte mit

    WHERE C1 IN (...)

    mehrere Bedingungen überprüfen:

    Code:
    select v1
    , case when v1 in (  TO_NUMBER(TO_CHAR(SYSDATE -365, 'YYYY') || '99'), --200799
                       , TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY') || '99') --200899
                       , (SELECT c1 --hier können dann auch mehrere Werte rauskommen, z.B. 201099 202099 usw.
          	             FROM tabelle2
         	             WHERE ...)
                       )
         then 'XXX' 
         
        else 'YYY'
         end
    from tabelle1
    Das geht aber nicht, weil:
    [Oracle]ORA-01427: single-row subquery returns more than one row (0,12 secs)

    Ist ja eigentlich auch klar, da die ersten beiden Statements "nebeneinader" geholt werden, die Ergebnisse des Selects aber "untereinander" sind.

    Wie könnte ich es denn hinbekommen, dass die Ergebnisse des SELECT auch in der IN-Bedingung des Case verwendet werden können?

  2. #2
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Vielleicht nicht die ideale Lösung, aber das wär noch eine Möglichkeit:

    Code:
    select v1
    , case when v1 in (select c1 from test.tabelle2) or v1 = '200799' or v1 = '200899'
         then 'XXX' 
        else 'YYY'
         end
    from test.tabelle1
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  3. #3
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Union funzt natürlich auch:

    Code:
    SET SEARCH_PATH TO TEST;
    SET ADD_MISSING_FROM TO TRUE;
    SELECT TABELLE1.V1
    , CASE WHEN TABELLE1.V1 IN (SELECT TABELLE2.C1 UNION SELECT '200799' UNION SELECT '200899')
        THEN 'XXX' 
        ELSE 'YYY'
      END
    PS:
    Ich bin hier auf Postgres. Für Oracle musst du die statischen Werte natürlich von DUAL abfragen.
    Geändert von Waxolunist (08-05-2008 um 23:02 Uhr)
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  4. #4
    Registrierter Benutzer
    Registriert seit
    17.05.2006
    Beiträge
    63
    OK danke für die Hinweise!

    Ich verwende jetzt den Union, damit klappt's!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •