【问题标题】:Using Case When in the Where Clause in Oracle在 Oracle 的 Where 子句中使用 case when
【发布时间】:2016-04-27 15:35:06
【问题描述】:

我有一个带有输入参数 p_card_type 的过程。根据输入参数,where 子句会发生变化。这是查询的样子。我有 4 个不同的选项,它们都出错了。

    SELECT * FROM table WHERE CARD_TYPE in (p_card_type)

--这是我尝试过的 4 个选项。

SELECT * FROM table WHERE   
- Case p_card_type when 'EGC/VEGC' THEN CARD_TYPE in ('EGC', 'VEGC') else CARD_TYPE in (p_card_type) End

- Case WHEN p_card_type = 'EGC/VEGC' THEN CARD_TYPE in ('EGC', 'VEGC') else CARD_TYPE in (p_card_type) End

- CARD_TYPE in Case WHEN p_card_type = 'EGC/VEGC' THEN ('EGC', 'VEGC') else (p_card_type) End

- CARD_TYPE in Case p_card_type WHEN 'EGC/VEGC' THEN ('EGC', 'VEGC') else (p_card_type) End

我得到的错误是 ORA-06550: PL/SQL: ORA-00905: 缺少关键字 ORA-06550: PL/SQL: SQL 语句被忽略

非常感谢您对此提供的任何帮助。非常感谢。

【问题讨论】:

    标签: oracle plsql where-clause case-when


    【解决方案1】:

    您可以使用一些布尔逻辑以更易读的方式重写您的查询:

    SELECT *
    FROM table
    WHERE   
         ( p_card_type ='EGC/VEGC' AND CARD_TYPE in ('EGC', 'VEGC') )
         OR
         ( ...) 
    

    【讨论】:

      【解决方案2】:

      这是对索引最友好的解决方案:

      SELECT  *
      FROM    mytable
      WHERE   p_card_type = 'EGC/VEGC'
              AND card_type IN ('EGC', 'VEGC')
      UNION ALL
      SELECT  *
      FROM    mytable
      WHERE   p_card_type <> 'EGC/VEGC'
              AND card_type = p_card_type
      

      【讨论】:

      • 非常感谢,这两种解决方案都有效。将查看最适合的执行时间。
      • 联合似乎没有必要——既然可以一次完成,为什么要扫描基表两次?只需将 where 子句与 OR 运算符结合起来即可。
      • @mathguy:Oracle 的优化器足够聪明,如果p_card_type(输入参数)的条件无效,则不会扫描表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多