oracle 表名是变量,查询结果集为空转为0

今天做一张报表,遇到了两个问题

1.查询的那个表名是根据时间变化的。比如我现在要查询2015年的数据,我应该查询的表名是A2015apple  这张表 , 但是2015年一过,A2015apple这张表的数据就被封存起来了,到2016年,就会新建一张表A2016apple,所以我查询的表名A2016apple这张表了,当然,有一个前提,就是查询的时候不会跨年查询。所以,表名应该根据前台选择的日期来动态变化。当然,这里必须用到java代码来支持,因为oracle是不支持动态的sql的,除非是写一个函数或者存储过程。

String tableName = "A"+date2.substring(0, 4)+"apple"; 先把这个表名表示出来

“select fbendbal from " +tableName+ 

                      " where facctcode = '117000001' and fmonth = "+dbl.sqlMonth1(date2)+ "

开始的时候尝试着用很多sql函数来拼接表名,最终都失败了,最后在网上看到了这个思路。

2.遇到的第二个问题就是,我有两张表,我想用表1 的money字段减去表2的money字段,看到这个逻辑的时候我想,这也太简单了。直接是select  a.money - b.money as money from a,b where a.month=1 and b.month=1;就ok了  但是这里就有一个条件摆在这里  , 就是a表1月份和b表一月份都必须有数据,不然查出来就是没有结果集的。在这里,一个新的需求就诞生了,那就是当b表1月份没有数据的时候,肯定就是算a表中的1月份的money了。

首先想到的就是用nvl()函数。但是要怎么写才能让nvl函数起作用呢,不多说,直接贴sql,这里要用到left join   如果不用这些链接的话  最终还是查不出结果的

select nvl(a.fbendbal,0) - nvl(b.fbendbal,0) as fmoney
  from (select fbendbal
          from A2015001lbalance
         where facctcode = '117000001'
           and fmonth =
               to_number(to_char(to_date('2015-04-25', 'yyyy-mm-dd'), 'mm'))) a left join 
       (select fbendbal
          from A2015002lbalance
         where facctcode = '109'
           and fmonth =
               to_number(to_char(to_date('2015-04-25', 'yyyy-mm-dd'), 'mm')))  b on 1=1 

nvl(a,0)的意思就是  当a的值为0的时候,表达式就是0  , 当a不为0的时候,表达式的值就是a 

上面的b表本来是没有数据的,但是left join以后,其实就是外链接以后,就会把没有结果集的当做空来显示。就可以用nvl()函数把空显示为0 了   ,内链接在这方面是做不到。自己可以动手试一下
       




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值