#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
оператор. Но, как я уже упоминал, обычно не рекомендуется кодировать это таким образом.