Oracle 在where子句中使用case when语句时,如何使用in子句?

Oracle 在where子句中使用case when语句时,如何使用in子句?,oracle,plsql,plsqldeveloper,Oracle,Plsql,Plsqldeveloper,如何在case when语句的else块中使用in子句,在where子句中如何使用in子句,例如: select * from dummy_table dt where dt.some_column_1 in (case when dt.some_column_2 in (9,10) then dt.some_column_3 else (dt.some_column_4,dt.some_column_5)

如何在case when语句的else块中使用in子句,在where子句中如何使用in子句,例如:

    select * 
    from dummy_table dt 
    where dt.some_column_1 in 
    (case when 
          dt.some_column_2 in (9,10) then dt.some_column_3
          else (dt.some_column_4,dt.some_column_5)
    end); 

另一种方法可以是:

SELECT *
  FROM dummy_table dt
 WHERE ( dt.some_column_2 IN ( 9, 10 )
         AND dt.some_column_1 = dt.some_column_3 )
    OR ( dt.some_column_2 NOT IN ( 9, 10 )
         AND dt.some_column_1 IN ( dt.some_column_4, dt.some_column_5 ) ); 

在secord部分中使用NOT IN更新

IN子句只能使用(a)或(b)返回一组行的select语句。您的查询在括号内为它提供了一个CASE语句

我可以想出一些方法来做到这一点;还有很多

select *
from dummy_table dt
where dt.some_column_1 in 
(select dt.some_column_3 from dual where dt.some_column_2 in (9,10)
union select dt.some_column_4 from dual where dt.some_column_2 not in (9,10)
union select dt.some_column_5 from dual where dt.some_column_2 not in (9,10));

select *
from dummy_table dt
where dt.some_column_1 in 
(case when dt.some_column_2 in (9,10) then dt.some_column_3 else null end,
 case when dt.some_column_2 not in (9,10) then dt.some_column_4 else null end,
 case when dt.some_column_2 not in (9,10) then dt.some_column_5 else null end)
;

select *
from dummy_table dt
where (dt.some_column_2 in (9,10) and dt.some_column_1 = dt.some_column_3)
   or (dt.some_column_2 not in (9,10) and dt.some_column_1 in (dt.some_column_4, dt.some_column_5))
;

我认为您可能需要修改上述备选方案

SELECT *
  FROM dummy_table dt
 WHERE ( dt.some_column_2 IN ( 9, 10 )
         AND dt.some_column_1 = dt.some_column_3 )
    OR ( dt.some_column_2 NOTIN ( 9, 10 ) AND dt.some_column_1 IN ( dt.some_column_4, dt.some_column_5 ); 

有人能回答这个问题吗?或者给出一个替代方法来完成这个问题吗?谢谢Kobi,我想这会有用的。再次感谢!:)如果列_2是9,列_1在(列_4,列_5),这将返回与原始查询逻辑不完全相同的行。OR的后半部分需要
dt。有些列不在(9,10)
中,因此需要对等。@MridulMadhukar,别忘了标记为答案,如果它符合您的需要,为什么不符合,请查看其他答案Hanks Kobi我正在尝试这一点以及其他建议,一旦我得到一个正确的输出,我肯定会标记答案。谢谢维迪亚,我在做这件事,我想这是可行的。谢谢你的回复!:)嗨,kfinity,我正在尝试Kobi和Vidya的建议,如果这不起作用,我一定会尝试你的建议。谢谢你的回复!:)