6

这是一个简单的问题,我已经阅读了有关使用CASEinWHERE子句的一些详细信息,但无法清楚地知道如何使用它。以下是我的示例查询:

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

4 回答 4

3

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

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,但它会更困难且效率更低。

于 2013-07-13T23:59:53.363 回答
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;
于 2013-07-11T04:24:28.833 回答
2

为什么这么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' );
于 2013-07-11T06:25:05.470 回答
-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
于 2014-06-05T16:02:33.580 回答