2011-11-11 5 views
5

Après la requête Oracle est conforme et fonctionne très bien:cas dans Oracle clause 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); 

Maintenant, dans mon cas je voudrais ajouter en deuxième lorsque ie (2 < 1) deux rolename (« propriétaire Rôle » et ' Rôle du propriétaire Eval '). Veuillez nous indiquer comment la requête ci-dessus va changer.

Merci d'avance.

-Justin Samuel

+2

'2 <1' est toujours faux. Qu'essayez-vous de faire? –

+0

Je sais ... juste compiler la requête. Ou alors, inversons le cas quand. Je voulais juste dire compiler .... –

Répondre

10

Pourquoi utiliser un CASE? Pourquoi ne pas simplement

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

Je suppose que vous ne l'avez pas fait prédicats qui sont codés en dur pour évaluer la valeur TRUE (1 < 2) ou FAUX (2 < 1) et que ceux-ci sont variables lient effectivement votre code actuel.

Si vous voulez vraiment utiliser une déclaration CASE, vous pouvez coder

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 

mais qui va être beaucoup plus difficile pour l'optimiseur à traiter et beaucoup moins clair pour le développeur qui doit maintenir il.

+0

Cela a résolu le problème. Merci Justin pour ça! –

+0

Cependant, comme "ypercube" a suggéré que je cherchais quelque chose en utilisant l'instruction CASE. Mais n'a pas pu résoudre le problème en utilisant CASE. Mais c'est définitivement une autre façon d'atteindre la même chose! :) –

+0

@Justin - J'ai mis à jour la réponse avec un exemple qui utilise une instruction 'CASE'. Mais comme je le dis, ce n'est généralement pas une bonne idée de le coder de cette façon. –

Questions connexes