2013-07-11 61 views
6

这是一个简单的问题,我已经阅读了关于在WHERE子句中使用CASE的一些详细信息,但无法清楚地知道如何使用它。以下是我的示例查询:Oracle case where 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行。

在此先感谢。

回答

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,但它会更困难,少有效。

1
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

这不会按预期工作。因为如果i_value作为'S'传递,那么代码中的第4行结果为0,并且条件失败。所以,整个输出将是没有的。深入了解。 – ajmalmhd04

+0

糟糕 - 我已经更新它来解决这个问题。 (以前有过“AND CASE WHERE 0_ELSE ...”,那么在第4行和第5行都将0更改为1, –

+0

再次看一下;) – ajmalmhd04

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'); 
+0

无论如何,这是更好的。但不适合我的代码。 (以上是我从大查询中使用的示例查询)。所以我用“如果i_value ='S'然后”方法。否则,我应该在每一行上使用大的硬编码。谢谢 – ajmalmhd04

-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