首页>>数据库>>oracle where语句使用decode
oracle where语句使用decode
来源: 时间: 2015-01-03 18:37:28

  

    数据库层有个方法,查询条件多,表关联复杂,最后决定使用jdbc拼接sql来保证查询速度。但是这样拼起来的sql代码很难看,一堆的if,大量字符串拼接。于是想看能不能就一条sql语句,然后使用绑定变量的方式。
      于是在oracle sqldeveloper工具使用以下语句来测试
select * from order
where code = :code
and order_date >= :order_date;
      然后执行sql,在运行sql的时候设置变量值,code是字符类型,在弹出的设置框值,不需要用单引号包含起来。而order_date是Date类型,使用2012-11-09这样的值不行,sysdate也出错。后来查下,原来sqldeveloper的默认日期格式很恶心,是这样的
DD-MON-RR
      而时间戳格式是
DD-MON-RR HH.MI.SSXFF AM
      什么样的数据才能满足这个格式,像下面这样
select to_date('19-11月-12 05.47.27 下午', 'DD-MON-RR HH.MI.SS AM') from dual;
      注意那个MON和AM的格式定义,使用Nov和AM字面量是不能成功转换成日期格式的。会根据本机的语言环境,中文环境要用11月、上午/下午这样的字眼才可以。可是每次输入这样的格式很麻烦。可以修改sqldeveloper的设置,在“工具->首选项->数据库->NLS->日期格式”中设置日期格式为YYYY-MM-DD,要想更详细点可以设置为YYYY-MM-DD HH24:MI:SS。
      其中有个时间戳格式,默认是这样DD-MON-RR HH.MI.SSXFF AM。在非工具环境下可以这样设置:
alter session set NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SSXFF';
insert into t values('2010-05-16 23:45:16.000000');
      转换成timestamp类型是这样:
select to_timestamp('2012-02-03 10:29:46.453234','yyyy-mm-dd hh24:mi:ss.ff6') from dual;
      注意这个的.ff6能达到XFF一样的效果。并且YYYY-MM-DD HH24:MI:SSXFF这样的格式必须使用to_timestamp才有用,之前一直在to_date中使用这样的格式,总是报错半天也没查出原因。
      好了,回到正题,在where中使用decode函数达到要求。
select * from zjk_pos_supplier_order
where ((decode(:code, NULL, 1, 0) = 1) or code = :code)
and order_date >= :order_date;
      以上语句如果:code变量赋值为null,则相当于语句
select * from zjk_pos_supplier_order
where order_date >= :order_date;
      当:code变量不为null时,则相当于
select * from zjk_pos_supplier_order
where code = :code
and order_date >= :order_date;
      对于where语句后是否可以用case或decode语句,答案是可以的,但要保证where语句中仍然是=值判断语句。

上一篇:Mysql数据库分页Limit优化 下一篇:oracle中的字符串查找函数INSTR的使用