Oracle case里面的where子句

时间:2013-07-11 04:19:16

标签: sql oracle plsql case where

这是一个简单的问题,我已经阅读了有关在CASE子句中使用WHERE的一些细节,但无法清楚地了解如何使用它。以下是我的示例查询:

1    SELECT * FROM dual
2    WHERE (1 =1)
3     AND (SYSDATE+1 > SYSDATE)
4     AND (30 > 40)
5     AND (25 < 35);

我在参数中有一个程序i_value。 如果i_value为'S',我需要忽略第4行,如果i_value为'T',我需要忽略第5行。

提前致谢。

4 个答案:

答案 0 :(得分:2)

 SELECT * FROM dual
 WHERE (1 =1)
 AND (SYSDATE+1 > SYSDATE)
 AND CASE WHEN i_value = 'S' THEN 1 ELSE CASE WHEN (30 > 40) THEN 1 ELSE 0 END END = 1
 AND CASE WHEN i_value = 'T' THEN 1 ELSE CASE WHEN (25 < 35) THEN 1 ELSE 0 END END = 1;

答案 1 :(得分:2)

我认为这是解决问题的最佳方法:

select *
from dual
where (1 = 1)
      and (sysdate + 1 > sysdate)
      and case
            when i_value = 'S'
              then
                case
                  when (25 < 35)
                    then 1
                    else 0
                end
            when i_value = 'T'
              then
                case
                  when (30 > 40)
                    then 1
                    else 0
                end
          end = 1;

当然,您可以使用动态SQL,但它会更难,效率更低。

答案 2 :(得分:1)

为什么所以ser 使用case

 SELECT * FROM dual
  WHERE (1 =1)
    AND ( SYSDATE+1 > SYSDATE )
    AND ( ((30 > 40) and i_value <> 'S') or i_value = 'S' )
    AND ( ((25 < 35) and i_value <> 'T') or i_value = 'T' );

答案 3 :(得分:-1)

这应该也可以。

case
  when (i_value = 'S' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (25 < 35)) ) then 1
  when (i_value = 'T' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (30 < 40)) ) then 1
  else 0
end = 1