来自CASE结果的IN语句在Where子句Oracle中

时间:2016-05-26 03:39:54

标签: oracle case

我有一个表的示例和我想在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个联合查询。

在我试过的一个声明中有什么办法吗?

2 个答案:

答案 0 :(得分:2)

我相信CASE语句只能返回一个值(对应于结果集中的一列)。但是,您可以在WHERE子句中执行此操作而不使用CASE语句:

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

答案 1 :(得分:1)

我更喜欢Tim回答,但至少在postgres中你可以做到这一点。 无法在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   

<强>输出

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