Использование Case When в предложении Where в Oracle

У меня есть процедура с входным параметром p_card_type. Предложение where изменяется в зависимости от входного параметра. Вот как выглядит запрос. У меня есть 4 разных варианта, и все они выходят из строя.

    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 игнорируется

Был бы очень признателен за любую помощь в этом. Большое спасибо.


person TheRaoMeister    schedule 27.04.2016    source источник


Ответы (2)


Вы можете переписать свой запрос с некоторой логической логикой в ​​более удобочитаемом виде:

SELECT *
FROM table
WHERE   
     ( p_card_type ='EGC/VEGC' AND CARD_TYPE in ('EGC', 'VEGC') )
     OR
     ( ...) 
person Aleksej    schedule 27.04.2016

Это наиболее удобное для индексации решение:

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
person Quassnoi    schedule 27.04.2016
comment
Большое спасибо, оба решения работают. Посмотрим на время исполнения для наилучшего соответствия. - person TheRaoMeister; 27.04.2016
comment
Объединение кажется ненужным - зачем сканировать базовую таблицу дважды, если это можно сделать за один проход? Просто объедините предложения where с оператором OR. - person mathguy; 27.04.2016
comment
@mathguy: Оптимизатор Oracle достаточно умен, чтобы не сканировать таблицу, если условие на p_card_type (входной параметр) недопустимо. - person Quassnoi; 27.04.2016