2016-05-26 9 views
0

私はOracleで解決しようとしているテーブルと問題のサンプルを持っています。Where文のCASE結果からのIN文Oracle

CREATE TABLE mytable (
id_field number 
,status_code number 
,desc1 varchar2(15) 
); 

INSERT INTO mytable VALUES (1,240,'desc1'); 
INSERT INTO mytable VALUES (2,242,'desc1'); 
INSERT INTO mytable VALUES (3,241,'desc1'); 
INSERT INTO mytable VALUES (4,244,'desc1'); 
INSERT INTO mytable VALUES (5,240,'desc2'); 
INSERT INTO mytable VALUES (6,242,'desc2'); 
INSERT INTO mytable VALUES (7,245,'desc2'); 
INSERT INTO mytable VALUES (8,246,'desc2'); 
INSERT INTO mytable VALUES (9,246,'desc1'); 
INSERT INTO mytable VALUES (10,242,'desc1'); 

commit; 

SELECT * 
FROM mytable 
WHERE status_code IN CASE WHEN desc1 = 'desc1' THEN (240,242) 
          WHEN desc1 = 'desc2' THEN (240,245) 
          END 

基本的に、条件ごとにステータスコードのサブセットを選択する必要があります。 私は別のステートメントでこれを解決することができましたが、私がこれをやっている実際のテーブルには複数の記述があり、約20のユニオンクエリが発生します。

私は試行したように、1つのステートメントでこれを行う方法はありますか?

答えて

2

私はCASEステートメントは1つの値(結果セットの1つの列に対応する)を返すだけと信じています。しかし、あなたがCASEステートメントを使用せずにWHERE句でこれをachiveことができます。

WHERE (desc1 = 'desc1' AND status_code IN (240,242)) OR 
     (desc1 = 'desc2' AND status_code IN (240,245)) 
+0

おかげでそれを試してみてください。感謝のヒープ –

1

を私はティムが良く答えるように、しかし、少なくともpostgresの中で、あなたがこれを行うことができます。 couldntのは、私は、このもともとを試みたが、括弧なしでOracle

Sql Fiddle DEMO

SELECT * 
FROM mytable 
WHERE CASE WHEN desc1 = 'desc1' THEN status_code IN (240,242) 
      WHEN desc1 = 'desc2' THEN status_code IN (240,245) 
     END 
ORDER BY desc1 

OUTPUT

| id_field | status_code | desc1 | 
|----------|-------------|-------| 
|  1 |   240 | desc1 | 
|  2 |   242 | desc1 | 
|  10 |   242 | desc1 | 
|  5 |   240 | desc2 | 
|  7 |   245 | desc2 |