WHERE子句中的Oracle PL SQL CASE

时间:2014-04-03 18:36:48

标签: oracle plsql case where

我知道我可以通过在CASE语句中轻松地放入两个完整的语句来实现这一点,但我是SQL的新手,并试图学习以最有效和最智能的方式编写这个而不重复任何逻辑,所以我想也许有一种方法我可以基本打开或关闭where条件线。

我有以下声明(btw不起作用,缺少一个关键字):

      OPEN O_CURSOR FOR
       SELECT S.STORE_NO_4_DIGIT AS STORE_NO, S.STORE_NAME
         FROM RFS.RF_STORE S
        WHERE S.TYPE_CODE != 'W'
        AND
            CASE I_CAN_BE_CLOSED
                WHEN 0 THEN
                S.CLOSE_DATE IS NULL
            END                
     ORDER BY S.STORE_NO_4_DIGIT;

有两种情况基于输入变量I_CAN_BE_CLOSED,值为0或1.

在一种情况下,我想允许它返回只有NULL CLOSE_DATES的商店,而在另一种情况下我希望它返回(关闭和非关闭商店)。

2 个答案:

答案 0 :(得分:1)

听起来你只想OR一起使用几个谓词

AND ((i_can_be_closed = 0 and s.close_date IS NULL) or
     (i_can_be_closed = 1))

答案 1 :(得分:1)

CASE表达式不能在Oracle SQL中返回布尔值。这应该是等效的,前提是I_CAN_BE_CLOSED永远不是NULL:

  OPEN O_CURSOR FOR
   SELECT S.STORE_NO_4_DIGIT AS STORE_NO, S.STORE_NAME
     FROM RFS.RF_STORE S
    WHERE S.TYPE_CODE != 'W'
    AND (I_CAN_BE_CLOSED != 0 OR S.CLOSE_DATE IS NULL)
 ORDER BY S.STORE_NO_4_DIGIT;

修改

事实上,这里给出的答案都是正确的......最简单的验证方法是在真假表中写下每个案例:

I_CAN_BE_CLOSED  S.CLOSE_DATE  [1]                      [2]   
0                 NULL          FALSE OR TRUE = TRUE    (TRUE AND TRUE) OR FALSE = TRUE
0                 NOT NULL      FALSE OR FALSE = FALSE  (TRUE AND FALSE) OR FALSE = FALSE
1                 NULL          TRUE OR TRUE = TRUE     (FALSE AND TRUE) OR TRUE = TRUE
1                 NULL          TRUE OR FALSE = TRUE    (FALSE AND FALSE) OR TRUE = TRUE

[1] == "I_CAN_BE_CLOSED != 0 OR S.CLOSE_DATE IS NULL"
[2] == "((i_can_be_closed = 0 and s.close_date IS NULL) or (i_can_be_closed = 1))"