Oracle SQL查询中的条件where子句

艾卜哈

我在中有一个查询APEX,该查询基于顶点中项目的值使用where子句条件。如果日期是,null那么我想显示表中的所有记录,如果日期不是,null我想根据该值添加条件。我怎样才能做到这一点 ?

我想在以下两个条件下添加,如果P2_SELECT_DATE不为null:

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)

而且,如果theP2_SELECT_DATE为null,那么我根本就不需要在where子句中拥有这些条件。

托尼·安德鲁斯

你可以这样做:

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;

“ where 1 = 1”只是一个技巧,因此任何有条件附加的过滤器总是以“ and”开头。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章