Oracle中使用IN子句的CASE条件

时间:2015-05-05 03:31:12

标签: sql oracle

我试图在case语句之后传递in子句但面临错误。

条件是

AND (CASE order_date>sysdate 
      then fee_rate_type in ('REGULAR','BONUS')
      ELSE FEE_RATE_TYPE in ('REGULAR') END)

当我通过单一价值而非多次传递时(通过'奖金' REGULAR'奖金'奖金')然后它的工作正常。

表格结构:

ID  fee_rate    order_date
--  --------    ----------
1   REGULAR     02/02/2016
2   BONUS       02/02/2016
3   BONUS       02/02/2016
4   BONUS       02/02/2016
5   PROMO       02/02/2016
6   PROMO       02/02/2016

请协助。

2 个答案:

答案 0 :(得分:1)

case语句是一个返回单个值的表达式。如果您想使用case,则需要返回一个值并进行比较:

(CASE order_date > sysdate and fee_rate_type in ('REGULAR', 'BONUS') then 1
      order_date <= sysdate and FEE_RATE_TYPE in ('REGULAR') then 1
 END) = 1

但是,我建议您不要在case条款中使用where。您可以将此表达为简单条件。这是一种方式:

((order_date > sysdate and fee_rate_type in ('REGULAR', 'BONUS') ) OR
 (order_date <= sysdate and FEE_RATE_TYPE in ('REGULAR') )
)

或者,或许:

(fee_rate_type = 'REGULAR' or
 (order_date > sysdate and fee_rate_type = 'BONUS')
)

答案 1 :(得分:-1)

尝试以下查询:

AND (CASE order_date>sysdate 
      then fee_rate_type = ALL ('REGULAR','BONUS')
      ELSE FEE_RATE_TYPE in ('REGULAR') END)