2012-12-19 3 views
3

Мне нужно использовать условное выражение, где ниже, чем одна, какая рабочая версия этого предложения?oracle conditional where where with filter

AND CASE WHEN b.kurum_turu = 1 
     THEN u.kod in ('1125', '2975', '1127', '4460', '1128', '1126') 
    ELSE u.kod in ('1125', '2975')     
END 
+2

Вы ищете это в запросе? – APC

ответ

9

Похоже, вы хотите, чтобы это для WHERE пункта:

WHERE 
(
    b.kurum_turu = 1 
    AND u.kod in ('1125', '2975', '1127', '4460', '1128', '1126') 
) 
OR 
(
    u.kod in ('1125', '2975') 
) 
2

Вы можете переписать, что, как

... 
WHERE 
    (
     (b.kurum_turu = 1 AND u.kod in ('1125', '2975', '1127', '4460', '1128', '1126')) 
     OR 
     ((b.kurum_turu IS NULL OR b.kurum_turu != 1) AND u.kod in ('1125', '2975')) 
    ) 
+1

+1, но вы, возможно, захотите добавить что-то для kurum_turu, являющееся нулевым –

+0

Ah! Спасибо, исправил фрагмент, чтобы рассмотреть нули. – Vikdor

+0

Учитывая первое условие, '(b.kurum_turu IS NULL ИЛИ b.kurum_turu! = 1)' не нужно во втором –

2

я думаю, что это то, что вам нужно ..

where ...AND CASE WHEN b.kurum_turu = 1 
     and u.kod in ('1125', '2975', '1127', '4460', '1128', '1126') then 1 
     when u.kod in ('1125', '2975') then 1 
    else 0  
END=1 
+0

его нехорошо писать так (хотя это возможно). с этим подходом вы могли бы отменить любую возможность индекса. оценка bluefeet выше более дружественна к индексу. – DazzaL

+0

Получил это @DazzaL, вы говорили, как в этом типе запроса, таблица в любом случае пойдет для полного сканирования даже при наличии индекса ... исправьте меня, если я ошибаюсь .. – GKV

0

Мое отношение:

AND 1 = CASE 
     WHEN b.kurum_turu = 1 AND u.kod in ('1125', '2975', '1127', '4460', '1128', '1126') THEN 1 ELSE 1 END