2013-03-13 7 views
5

Ich arbeite mit einer Abfrage, die "IF" -Anweisungen innerhalb einer "WHERE" -Klausel enthält. Aber PL \ SQL Developer gibt einige Fehler während der Ausführung. Kann mir bitte jemand bei der richtigen Abfrage helfen? Hier ist die Abfrage:If-Anweisung in Where-Klausel

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; 

Ich erhalte den Fehler "ORA-00920: ungültiger relationaler Operator".

Platzieren von Klammern um status_flag = STATUS_ACTIVE Ergebnisse in Fehler „ORA-00907: fehlende rechte Klammer“

Antwort

9

CASE können Sie helfen:

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; 

Die CASE statement mehrere Bedingungen wertet einen einzelnen Wert zu erzeugen. In der ersten Verwendung überprüfe ich den Wert von status_flag, gebe 'A', 'T' oder null zurück, je nachdem, was der Wert ist, und vergleiche das mit t.status. Ich mache dasselbe für die Spalte business_unit mit einer zweiten CASE-Anweisung.

+0

danke! das hat wirklich geholfen – user2100620

+0

@DCookie, Wie kann ich eine WHERE-Bedingung in einer IF-Anweisung hinzufügen? – masT

+0

Fall: 't.status = null 'würde nicht für Fälle funktionieren, in denen t.status tatsächlich null ist. Null ist komisch. – defactodeity

3

Sie nicht, wenn so verwenden können. Sie können tun, was Sie wollen mit AND und 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

Anstatt AND und OR zu verwenden, was, wenn ich CASE verwendete? 'WHERE CASE wenn status_flag = STATUS_ACTIVE dann t.status 'A' = wenn status_flag = STATUS_INACTIVE dann t.status = 'T' wenn source_flag = SOURCE_FUNCTION dann t.business_unit = 'Herstellung' wenn source_flag = SOURCE_USER dann t.business_unit = 'Benutzer' END UND t.first_name LIKE Vorname UND t.last_name LIKE Nachname UND t.employid LIKE Employeeid; ' ich Fehler "ORA-00905: fehlende Stichwort" erhalten. Was genau habe ich in diesem Fall falsch gemacht? – user2100620

+0

Siehe meine Antwort. Du kommst näher. – DCookie