Условный оператор where в запросе Oracle SQL - PullRequest
0 голосов
/ 29 января 2019

У меня есть запрос в APEX, который использует условие условия where, основанное на значении элемента в вершине.Если дата null, то я хочу показать все записи из таблицы, а если дата не null, я хочу добавить, где условия основаны на этом значении.Как я могу это сделать ?

Я хочу добавить ниже 2 условий, если P2_SELECT_DATE не равно нулю:

select * from HR_DATA
where 
     :P2_SELECT_DATE between  person_eff_start_date and person_eff_end_date
 and :P2_SELECT_DATE between nvl(assign_eff_start_date,sysdate-1) and nvl(assign_eff_end_date, sysdate+1)

И если P2_SELECT_DATE равно нулю, тогда я не хочу, чтобы эти условия были впредложение where вообще.

1 Ответ

0 голосов
/ 29 января 2019

Вы можете сделать это:

select * from HR_DATA
where (:P2_SELECT_DATE is null
      or (:P2_SELECT_DATE between person_eff_start_date and person_eff_end_date
         and :P2_SELECT_DATE between nvl(assign_eff_start_date,sysdate-1) 
                                 and nvl(assign_eff_end_date, sysdate+1)
      )

Иногда, если есть много дополнительных фильтров, может быть более эффективно построить запрос динамически:

declare
    q long;
begin    
    q := 'select * from HR_DATA where 1=1';

    if :P2_SELECT_DATE is null then
       q := q || ' and :P2_SELECT_DATE between person_eff_start_date and person_eff_end_date'
              || ' and :P2_SELECT_DATE between nvl(assign_eff_start_date,sysdate-1)'
              || ' and nvl(assign_eff_end_date, sysdate+1);
    end if;
    return q;
end;

"где 1= 1 "- это просто хитрость, поэтому любые условно добавленные фильтры всегда начинаются с" и ".

...