2016-06-29 4 views
0

Допустим, у меня есть этот запрос:использование таблицы и объединения таблиц, если переменная

SELECT a.id, 
    c.c_date 
FROM table_a a 
    JOIN table_c c ON a.id = c.id 
WHERE c_date is null; 

Я тогда также иметь эту переменную: p_filter

Если эта переменная равна «да», я хочу запрос, показанный ранее для выполнения, как показано, чтобы таблица a и таблица c соединялись, и что c_date выполняется поиск нулевых значений. Если переменная равна «нет» или любое другое значение, я хотел бы не использовать table_c и не присоединиться к так, что запрос будет затем выполнить такие, как это:

SELECT a.id 
    --omitted c.c_date 
FROM table_a a ; 
    --omitted JOIN table_c c ON a.id = c.id 
    --omitted WHERE c_date is null; 
+0

Пожалуйста, отметьте правильные значения rdbms. –

+0

@FelixPamittan Сделано. Это Oracle 11g – user2924127

ответ

0

Может быть, ваш может попробовать это;)

SELECT DISTINCT a.id, 
    CASE WHEN $p_filter = 'yes' THEN c.c_date ELSE NULL END AS c_date 
FROM table_a a 
JOIN table_c c ON $p_filter = 'no' OR (a.id = c.id AND c.c_date IS NULL); 

Отредактировано:

SELECT DISTINCT a.id, 
    c.c_date 
FROM table_a a 
LEFT JOIN table_c c ON $p_filter = 'yes' AND a.id = c.id AND c.c_date IS NULL; 
+0

не будет ли это включать table_c, когда p_filter = 'N'? Когда я запускаю его, и он равен N, я получаю избыточные строки. – user2924127

+0

@ user2924127 Вы правы, это даст вам дублированный результат. Обновленный ответ, проверьте его снова, пожалуйста. Ответ «LEFT JOIN» должен дать вам то, что вы хотите. – Blank

0

и можно использовать профсоюзу

SELECT a.id, c.c_date 
    FROM table_a a JOIN table_c c ON a.id = c.id 
WHERE :p_filter = 'yes' AND c_date IS NULL 

UNION ALL 

SELECT a.id, NULL c_date 
    FROM table_a a 
WHERE NVL (:p_filter, 'no') != 'yes' 
Смежные вопросы