注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

oracle where语句使用decode  

2012-11-19 21:40:20|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      数据库层有个方法,查询条件多,表关联复杂,最后决定使用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语句中仍然是=值判断语句。
  评论这张
 
阅读(2975)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018