2011-11-11 80 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'語句的例子更新了答案。但正如我所說,以這種方式進行編碼通常不是一個好主意。 –