2016-04-27 6 views
1

Ich habe eine Prozedur, die einen Eingabeparameter p_card_type hat. Basierend auf dem Eingabeparameter ändert sich die Where-Klausel. Hier ist ein wie die Abfrage aussieht. Ich habe 4 verschiedene Optionen und sie alle Fehler aus.Case verwenden Wenn in der Where-Klausel in Oracle

SELECT * FROM table WHERE CARD_TYPE in (p_card_type) 

--Hier sind die 4 Optionen, die ich ausprobiert habe.

SELECT * FROM table WHERE 
- Case p_card_type when 'EGC/VEGC' THEN CARD_TYPE in ('EGC', 'VEGC') else CARD_TYPE in (p_card_type) End 

- Case WHEN p_card_type = 'EGC/VEGC' THEN CARD_TYPE in ('EGC', 'VEGC') else CARD_TYPE in (p_card_type) End 

- CARD_TYPE in Case WHEN p_card_type = 'EGC/VEGC' THEN ('EGC', 'VEGC') else (p_card_type) End 

- CARD_TYPE in Case p_card_type WHEN 'EGC/VEGC' THEN ('EGC', 'VEGC') else (p_card_type) End 

Der Fehler, den ich bekommen ist ORA-06550: PL/SQL: ORA-00905: fehlende Stichwort ORA-06550: PL/SQL: SQL-Anweisung

ignoriert

Würde schätzen wirklich jede Art von Hilfe darauf. Danke vielmals.

Antwort

0

Sie Ihre Abfrage mit einigen Booleschen Logik neu schreiben kann, in einem besser lesbaren Art und Weise:

SELECT * 
FROM table 
WHERE 
    (p_card_type ='EGC/VEGC' AND CARD_TYPE in ('EGC', 'VEGC')) 
    OR 
    (...) 
0

Dies ist der Index freundliche Lösung:

SELECT * 
FROM mytable 
WHERE p_card_type = 'EGC/VEGC' 
     AND card_type IN ('EGC', 'VEGC') 
UNION ALL 
SELECT * 
FROM mytable 
WHERE p_card_type <> 'EGC/VEGC' 
     AND card_type = p_card_type 
+0

Vielen Dank, sowohl die Lösungen arbeiten . Betrachtet die Ausführungszeit für die beste Anpassung. – TheRaoMeister

+0

Die Verbindung scheint unnötig zu sein - warum sollte die Basistabelle zweimal gescannt werden, wenn es in einem Durchgang möglich ist? Kombinieren Sie einfach die Where-Klauseln mit dem OR-Operator. – mathguy

+0

@mathguy: Oracles Optimierer ist schlau genug, die Tabelle nicht zu scannen, wenn die Bedingung auf 'p_card_type' (der Eingabeparameter) ungültig ist. – Quassnoi

Verwandte Themen