如何只编写一个与where子句不同的查询,以捕获布尔测试的逻辑?

时间:2011-12-13 19:59:41

标签: sql oracle plsql

在使用PL / SQL的Oracle 11g引擎上 我有像这样运行的逻辑

if (flag = Y) then 
   select id, flavor, color
   from menu
   where flavor in (1,2,3,4,5);
else 
   select 
   id, flavor, color
from 
   menu
   where flavor in (2,4,6);
end if;

我在考虑在 where 子句中使用解码或案例逻辑?我想只有一个可以处理'flag'值的查询。

2 个答案:

答案 0 :(得分:4)

您可以将其更改为使用OR吗? (假设如果不是Y则标记为N,但可以为NULL,将其视为N)

  select 
   id, flavor, color
from 
   menu
   where 
        (flag = 'Y' and flavor in (1,2,3,4,5))
        or(nvl(flag,'N') = 'N' and flavor in (2,4,6)) ;

如果你想检查标志<> Y(以与@Crappy Coding Guy类似的方式发布,但它可以为NULL,更改

  

nvl(flag,'N')='N'

  

nvl(:flag,'N')<> 'Y'

就足够了

答案 1 :(得分:1)

Oracle中的逻辑运算符和比较运算符可能略有不同,但是这样的事情应该可以解决问题。

select id, flavor, color
from menu
where (flag = Y and flavor in (1, 2, 3, 4, 5))
      or (flag != Y and flavor in (2, 4, 6)