2013-03-13 15 views
5

pracuję z zapytaniem, które zawiera instrukcje "IF" w klauzuli "WHERE". Ale programista PL \ SQL daje pewne błędy podczas jego wykonywania. Czy ktoś może mi pomóc w poprawnym zapytaniu? Oto zapytanie:Jeśli instrukcja w klauzuli 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; 

Pojawia się błąd "ORA-00920: nieprawidłowy operator relacyjny".

Umieszczanie nawiasy wokół status_flag = STATUS_ACTIVE wyniki w błąd „ORA-00907: brak prawy nawias”

Odpowiedz

9

przypadku może pomóc:

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 ocenia wiele warunków do wytworzenia pojedynczej wartości. Tak więc w pierwszym użyciu sprawdzam wartość flagi status_flag, zwracam "A", "T" lub null, w zależności od tego, jaka jest jego wartość, i porównuję to do t.status. Robię to samo dla kolumny business_unit z drugą instrukcją CASE.

+0

dzięki! to naprawdę pomogło – user2100620

+0

@DCookie, Jak dodać warunek klauzuli WHERE do instrukcji IF? – masT

+0

Przypadek: 't.status = null' nie działałby w przypadkach, gdy t.status jest rzeczywiście pusty. Null jest dziwny. – defactodeity

3

nie można używać, jeśli tak. Możesz robić co chcesz z I i 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

Zamiast używać AND i OR, co jeśli użyłem CASE? 'którym kaseta gdy status_flag = następnie STATUS_ACTIVE t.status = 'A' gdy status_flag = następnie STATUS_INACTIVE t.status = 'T' gdy source_flag = SOURCE_FUNCTION następnie t.business_unit = 'produkcja' gdy source_flag = SOURCE_USER następnie t.business_unit = 'użytkownicy' END I t.first_name LIKE Imię I t.last_name LIKE lastname I t.employid LIKE IDpracownika; ' otrzymuję błąd "ORA-00905: brakuje słowa kluczowego". Co dokładnie zrobiłem źle w tej sprawie? – user2100620

+0

Zobacz moją odpowiedź. Zbliżasz się. – DCookie

Powiązane problemy