2013-03-13 3 views
5

Я работаю с запросом, который содержит инструкции «IF» в предложении «WHERE». Но PL \ SQL Developer дает некоторые ошибки при его выполнении. Может ли кто-нибудь помочь мне с правильным запросом? Вот запрос:Оператор if в разделе Where

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: отсутствует правая скобка»

ответ

9

СЛУЧАЙ может помочь вам:

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

+0

спасибо! что действительно помогло – user2100620

+0

@DCookie, Как я могу добавить условие WHERE в выражении IF? – masT

+0

Дело: 't.status = null' не будет работать в случаях, когда t.status фактически является нулевым. Нуль странно. – defactodeity

3

Вы не можете использовать, если так. Вы можете делать то, что вы хотите с 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; 
+0

Вместо использования AND и OR, что делать, если я использовал CASE? 'ГДЕ Случай, когда status_flag = STATUS_ACTIVE затем t.status = 'A' , когда status_flag = STATUS_INACTIVE затем t.status = 'T' при source_flag = SOURCE_FUNCTION затем t.business_unit = 'производства' при source_flag = SOURCE_USER затем t.business_unit = 'пользователей' END И t.first_name LIKE Firstname И t.last_name LIKE Lastname И t.employid LIKE EmployeeID; ' я получаю ошибку "ORA-00905: отсутствует ключевое слово". Что именно я сделал в этом случае неправильно? – user2100620

+0

См. Мой ответ. Вы приближаетесь. – DCookie