【问题标题】:oracle conditional where clause with filter带有过滤器的 oracle 条件 where 子句
【发布时间】:2012-12-06 18:22:14
【问题描述】:

我必须使用像下面这样的条件 where 子句,这个子句的工作版本是什么?

AND CASE WHEN b.kurum_turu = 1 
         THEN u.kod  in ('1125', '2975', '1127', '4460', '1128', '1126')  
    ELSE u.kod  in ('1125', '2975')                 
END

【问题讨论】:

  • 您在查询中使用这个?

标签: sql oracle conditional where-clause


【解决方案1】:

听起来你想要这个 WHERE 子句:

WHERE
(
  b.kurum_turu = 1
  AND u.kod  in ('1125', '2975', '1127', '4460', '1128', '1126')
)
OR
(
  u.kod  in ('1125', '2975') 
)

【讨论】:

    【解决方案2】:

    我认为这就是你需要的..

     where ...AND CASE WHEN b.kurum_turu = 1 
             and u.kod  in ('1125', '2975', '1127', '4460', '1128', '1126') then 1  
             when  u.kod  in ('1125', '2975') then 1
         else 0      
    END=1
    

    【讨论】:

    • 这样写不好(尽管有可能)。你会用这种方法否定任何索引的可能性。 bluefeet 的上述方法对索引更友好。
    • 知道了@DazzaL,你说的是在这种类型的查询中,即使存在索引,表格也会进行全面扫描......如果我错了,请纠正我......
    【解决方案3】:

    你可以改写成

    ...
    WHERE
        (
            (b.kurum_turu = 1 AND u.kod in ('1125', '2975', '1127', '4460', '1128', '1126'))
            OR
            ((b.kurum_turu IS NULL OR b.kurum_turu != 1) AND u.kod in ('1125', '2975'))
        )
    

    【讨论】:

    • +1,但您可能想为 kurum_turu 为空添加一些内容
    • 鉴于第一个条件,(b.kurum_turu IS NULL OR b.kurum_turu != 1) 在第二个中是不必要的
    【解决方案4】:

    我的方法是这样的:

     AND 1 = CASE
             WHEN  b.kurum_turu = 1 AND u.kod  in ('1125', '2975', '1127', '4460', '1128', '1126') THEN 1 ELSE 1 END
    

    【讨论】:

      【解决方案5】:

      使用CONNECT BY 转换字符串列表以获得条件IN 语句。

      如果您有多个条件,则此解决方案很有用,因为您可以将 IN 子句编写为单个表达式,而无需任何其他 AND、OR 限制。

      WHERE u.kod IN 
      (
        SELECT rowdata FROM
        ( WITH DATA AS 
          (SELECT CASE WHEN b.kurum_turu = 1 THEN '1125, 2975, 1127, 4460, 1128, 1126' ELSE '1125, 2975' END rowdata FROM dual )
          SELECT trim(regexp_substr(rowdata, '[^,]+', 1, LEVEL)) rowdata FROM DATA CONNECT BY instr(rowdata, ',', 1, LEVEL - 1) > 0
        )
      )
      

      这带来了一个缺点,即逗号分隔值到数据行的转换有点复杂......但是您可以将这个复杂的部分提取到一个命名良好的函数中以隐藏这种复杂性。

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2013-08-25
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        相关资源
        最近更新 更多