【问题标题】:Oracle PL SQL CASE in WHERE clauseWHERE 子句中的 Oracle PL SQL CASE
【发布时间】:2014-04-03 18:36:48
【问题描述】:

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

我有以下语句(顺便说一句,它不起作用,缺少它说的关键字):

      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 的商店,而在另一种情况下,我希望它返回任何一种(关闭和非关闭商店)。

【问题讨论】:

    标签: oracle plsql case where


    【解决方案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))"
    

    【讨论】:

    • 对不起。贾斯汀打败了你……不知道这是否可行,除非我不明白 oracle 将如何执行它。如果第一个陈述是真的,它不会继续到第二个吗?
    • 好的,我又解决了这个问题,我尝试了这个,我意识到这是更优雅的解决方案。一开始我不确定,因为我不知道如果 SQL 发现第一个语句是真的,它会如何处理这两个语句。但事实并非如此,因此您不需要贾斯汀回答中的“或”。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多