2011-11-11 82 views
5

以下Oracle查询要求,并且工作正常:案例在甲骨文WHERE子句

SELECT Employee.EmployeeId, 
    Employee.EmployeeName, 
    Employee.Description , 
    Employee.IsFrozen 
FROM employee, employeerole, roledef 
where employee.employeeid = employeerole.employeeid 
and employeerole.roleid = roledef.roleid 
and rolename IN 
(case 
when (1 < 2) THEN ('Owner Role') 
when (2 < 1) THEN ('Eval Owner Role') 
END); 

现在在我的情况下,我想在第二次时,即(2 < 1)两大角色名(“所有者角色”和“添加评估所有者角色')。 请建议上述查询如何更改。

在此先感谢。

-Justin塞缪尔

+2

'2 <1'总是错误的。你试着做什么? –

+0

我知道......只是编译查询。否则,让我们反过来的情况。我只是想编译.... –

回答

10

为什么使用CASE?为什么不干脆

AND ( ((1 < 2) and rolename IN ('Owner Role', 'Eval Owner Role')) 
    OR ((2 < 1) and rolename IN ('Eval Owner Role'))) 

我假设你不这样做实际上有被硬编码,以评估为TRUE(1 < 2)或谓词FALSE(2 < 1),而这些实际上是绑定变量你的实际代码。

如果你真的想用一个CASE声明,你可以编写

AND(CASE WHEN (1 < 2) and rolename IN ('Owner Role', 'Eval Owner Role') 
      THEN 1 
      WHEN (2 < 1) and rolename IN ('Eval Owner Role') 
      THEN 1 
      ELSE 0 
     END) = 1 

但这将是更加困难的优化处理,并为具有维持开发商更清晰它。

+0

这确实解决了这个问题。感谢Justin! –

+0

但是,由于“ypercube”暗示我在使用CASE语句寻找某些东西。但是用CASE解决不了问题。但这绝对是另一种实现相同的方式! :) –

+0

@Justin - 我用一个使用'CASE'语句的例子更新了答案。但正如我所说,以这种方式进行编码通常不是一个好主意。 –