2012-02-16 17 views
5

¿Alguien me puede ayudar con esta consulta?Usando CASE para un predicado opcional

Soy nuevo en el uso de CASE, ¿cómo puedo hacer que esto funcione? Si rights = manager, entonces quiero ejecutar el código dentro del caso.

select email, user_id, first_name, last_name, rights 
from users u 
where company_id = 2141 
    and receives_emails = 'y' 
    case u.rights when 'manager' then 
     and user_id in (select user_id from manager_depts where company_id = u.company_id and dept_id = 2) 
    end 

¡Gracias!

+0

Lo RDBMS está usando? – Dan

+0

¿Está intentando ver si el usuario es gerente o solo quiere devolverlos si es un administrador? Este no es un lenguaje imperativo: no se puede (generalmente) modificar una tabla desde el interior de una cláusula 'WHERE'. –

Respuesta

5

En realidad no necesita un caso aquí,

SELECT email, u.user_id, first_name, last_name, rights 
FROM users u 
    LEFT JOIN manager_depts d ON d.company_id = u.company_id and d.dept_id = 2 
WHERE company_id = 2141 AND receives_emails = 'y' 
    AND (u.rights != 'manager' OR d.user_id IS NOT NULL) 
+0

¡Eso es perfecto, gracias! – RandyLahey

+0

@RandyLahey ¡Me alegro de poder ayudar! –

-1

escritura de esta manera

select 
    email, user_id, first_name, last_name, rights 
from 
    users u 
where 
    company_id = 2141 
    and 
    receives_emails = 'y' 
    and 
    (
     (
      u.rights = 'manager' 
      and 
      user_id in (
        select 
         user_id 
        from 
         manager_depts 
        where 
         company_id = u.company_id 
         and 
         dept_id = 2 
       ) 
     ) 
     or 
     (
      u.rights <> 'manager' 
     ) 
    ) 
Cuestiones relacionadas