带有表达式的where子句中的Oracle case

时间:2014-12-29 09:30:32

标签: oracle plsql case where-clause

我在oracle 10g中有以下查询:

select IN_OUT_DATE, STORE_NO, ART_NO, SUPPL_NO, SUPPL_TYPE, QTY from oltp_transactions_hist where art_no = :art_no and store_no = :store_no and in_out_type<50 and in_out_date between :X and :Y

如果变量:all为零,我想在 where 子句中添加以下表达式 case WHEN :all = 0 OLD_NN_BUY_PRICE_BEF<>OLD_NN_BUY_PRICE_AFT END CASE;

这可能吗?

1 个答案:

答案 0 :(得分:0)

case表达式返回除boolean之外的任何数据类型的值,可以与另一个值进行比较。 where子句要求一组或多组条件对于给定的数据集为真或假。

此外,casewhere是两回事。您绝对可以在case子句中使用where构造,但您必须知道它们的用途。 case构造比较一组条件并返回一个值,而where子句用于根据需求过滤行。

例如,为了进一步澄清,请考虑以下代码:

select 1 as coll
  from dual
 where case :x
           when 1 then 2
           else 0
       end = 2;

您无法删除结束短语= 2,因为您需要比较 case构造返回的值。你不能简单地在case子句中引入开放式where构造,而不将其值与任何东西进行比较。此外,如果输入x = 1,您将获得一行。如果你没有,你就不会。