2016-04-27 38 views
1

我有一個具有輸入參數p_card_type的過程。基於輸入參數,where子句發生變化。這是查詢的樣子。我有4個不同的選項,他們都出錯了。在Oracle的Where子句中使用案例

SELECT * FROM table WHERE CARD_TYPE in (p_card_type) 

- 這是我嘗試過的4個選項。

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 

我得到的錯誤是 ORA-06550:PL/SQL:ORA-00905:缺少關鍵字 ORA-06550:PL/SQL:SQL語句忽略

會很感激的任何形式的幫助在這。非常感謝。

回答

0

你可以用一些布爾邏輯重寫查詢,更可讀的方式:

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

這是最指數型解決方案:

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

非常感謝,這兩個解決方案工作。將看最適合的執行時間。 – TheRaoMeister

+0

聯合看起來沒有必要 - 爲什麼在一次掃描可以完成兩次掃描基表?只需將where子句與OR運算符結合起來。 – mathguy

+0

@mathguy:如果'p_card_type'(輸入參數)的條件無效,Oracle的優化器非常智能,因此不掃描表。 – Quassnoi