Случай в предложении Oracle WHERE

#oracle

#Oracle

Вопрос:

Следующий запрос oracle соответствует и работает нормально:

 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);
  

Теперь в моем случае я хотел бы добавить во втором, когда ie (2 < 1) два имени роли (‘Роль владельца’ и ‘Роль владельца Eval’).
Пожалуйста, подскажите, как изменится приведенный выше запрос.

Заранее спасибо.

-Джастин Сэмюэль

Комментарии:

1. 2 < 1 всегда равно false. Что вы пытаетесь сделать?

2. Я знаю … просто компилирую запрос. Или же давайте изменим случай when. Я просто имел в виду компиляцию….

Ответ №1:

Зачем использовать 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) и что на самом деле это переменные bind в вашем реальном коде.

Если вы действительно хотите использовать 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
  

но оптимизатору будет гораздо сложнее справиться с этим и гораздо менее понятно для разработчика, который должен его поддерживать.

Комментарии:

1. Однако, как предположил «ypercube», я искал что-то, используя оператор CASE. Но не смог решить проблему, используя CASE. Но это определенно другой способ добиться того же! 🙂

2. @Justin — Я обновил ответ примером, в котором используется CASE оператор. Но, как я уже упоминал, обычно не рекомендуется кодировать это таким образом.