Оператор If в предложении Where

Я работаю с запросом, который содержит операторы «ЕСЛИ» в предложении «ГДЕ». Но PL\SQL Developer выдает некоторые ошибки при его выполнении. Может ли кто-нибудь помочь мне с правильным запросом? Вот запрос:

SELECT t.first_name,
       t.last_name,
       t.employid,
       t.status
  FROM employeetable t
 WHERE IF status_flag = STATUS_ACTIVE then t.status = 'A'
       IF status_flag = STATUS_INACTIVE then t.status = 'T'
       IF source_flag = SOURCE_FUNCTION then t.business_unit = 'production'
       IF source_flag = SOURCE_USER then t.business_unit = 'users'
   AND t.first_name LIKE firstname
   AND t.last_name LIKE lastname
   AND t.employid LIKE employeeid;

Я получаю сообщение об ошибке «ORA-00920: неверный реляционный оператор».

Размещение квадратных скобок вокруг status_flag = STATUS_ACTIVE приводит к ошибке «ORA-00907: отсутствует правая скобка».


person user2100620    schedule 13.03.2013    source источник


Ответы (2)


CASE может вам помочь:

SELECT t.first_name,
       t.last_name,
       t.employid,
       t.status
  FROM employeetable t
 WHERE t.status = (CASE WHEN status_flag = STATUS_ACTIVE THEN 'A'
                        WHEN status_flag = STATUS_INACTIVE THEN 'T'
                        ELSE null END)
   AND t.business_unit = (CASE WHEN source_flag = SOURCE_FUNCTION THEN 'production'
                               WHEN source_flag = SOURCE_USER THEN 'users'
                               ELSE null END)
   AND t.first_name LIKE firstname
   AND t.last_name LIKE lastname
   AND t.employid LIKE employeeid;

оператор CASE оценивает несколько условий для получения одного значения. Итак, при первом использовании я проверяю значение status_flag, возвращая «A», «T» или null в зависимости от его значения, и сравниваю его с t.status. Я делаю то же самое для столбца business_unit со вторым оператором CASE.

person DCookie    schedule 14.03.2013
comment
@DCookie, как добавить условие предложения WHERE в оператор IF? - person masT; 19.06.2014
comment
Случай: t.status = null не будет работать в случаях, когда t.status фактически равен нулю. Нуль странный. - person defactodeity; 18.12.2014
comment
@defactodeity для проверки на null -- t.status равен null - person Yordan Georgiev; 19.10.2015
comment
Это не работает для меня. Когда я пытаюсь это сделать, я получаю сообщение об ошибке (ORA-00920). Ошибка возникает по ключевому слову THEN - person Elie G.; 12.08.2019

Вы не можете использовать IF так. Вы можете делать то, что хотите, с помощью AND и OR:

SELECT t.first_name,
       t.last_name,
       t.employid,
       t.status
  FROM employeetable t
 WHERE ((status_flag = STATUS_ACTIVE   AND t.status = 'A')
     OR (status_flag = STATUS_INACTIVE AND t.status = 'T')
     OR (source_flag = SOURCE_FUNCTION AND t.business_unit = 'production')
     OR (source_flag = SOURCE_USER     AND t.business_unit = 'users'))
   AND t.first_name LIKE firstname
   AND t.last_name  LIKE lastname
   AND t.employid   LIKE employeeid;
person John Kugelman    schedule 13.03.2013