PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Oracle: CASE WHEN ... IN ()



Joker
08-05-2008, 13:45
Hallo,

ich möchte mit

WHERE C1 IN (...)

mehrere Bedingungen überprüfen:



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?

Waxolunist
08-05-2008, 22:28
Vielleicht nicht die ideale Lösung, aber das wär noch eine Möglichkeit:


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

Waxolunist
08-05-2008, 22:39
Union funzt natürlich auch:


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.

Joker
09-05-2008, 13:19
OK danke für die Hinweise!

Ich verwende jetzt den Union, damit klappt's!