我懂楼主的意思,昨天我才给公司员工讲了这个需要注意。我们在Java程式中,对于比如select sum(col) col from tab where id=?.这样的查询,当条件id的值在tab中不存在事,查询时有结果集的,只是一个空的值,那么在Java程式中就要注意此类情况,if(rs.nect()){ } 这样的话,此类情况会进入if判断,因此,需要考虑这类情况逻辑是否正确!处理办法:加上group by 语句。SELECT SUM(TBD.f_frequency) FROM TB_BAS_DISASTERFREQUENCYP TBD WHERE SUBSTR(TO_CHAR(TBD.f_date, 'yyyy-MM-dd'), 1, 4) IN ('2009', '2010') AND SUBSTR(TO_CHAR(TBD.f_date, 'yyyy-MM-dd'), 6, 2) IN ('02') AND TBD.f_Disastercode = '1' AND SUBSTR(TBD.f_area, 1, 6) = '110000' GROUP BY SUBSTR(TO_CHAR(TBD.f_date, 'yyyy-MM-dd'), 1, 4),SUBSTR(TO_CHAR(TBD.f_date, 'yyyy-MM-dd'), 6, 2),TBD.f_Disastercode,SUBSTR(TBD.f_area, 1, 6)
我想要的是只有标题,没有那个空记录,这里不支持图片,着急啊,不知道各位朋友明白不?
至于为什么结果为空,没图没真相,只能猜一下,可能是结果集为空,或结果集中,这个字段值为空。
楼主最好把sum去掉,看一下明细数据是什么情况吧。
TBD.f_frequency 的值为空?要是sum的话 就不会统计 空的值
sum是肯定要返回一行的,无论结果有没有
空行就空行,你在程序里处理一下就行啊 为什么这么在意这个呢?
FROM TB_BAS_DISASTERFREQUENCYP TBD
WHERE SUBSTR(TO_CHAR(TBD.f_date, 'yyyy-MM-dd'), 1, 4) IN ('2009', '2010')
AND SUBSTR(TO_CHAR(TBD.f_date, 'yyyy-MM-dd'), 6, 2) IN ('02')
AND TBD.f_Disastercode = '1'
AND SUBSTR(TBD.f_area, 1, 6) = '110000'
GROUP BY SUBSTR(TO_CHAR(TBD.f_date, 'yyyy-MM-dd'), 1, 4),SUBSTR(TO_CHAR(TBD.f_date, 'yyyy-MM-dd'), 6, 2),TBD.f_Disastercode,SUBSTR(TBD.f_area, 1, 6)
SUM(1)
----------
SQL>
聚合函数一定返回行???
SUM(1)
----------SQL>
没看到------和SQL>之间有空白吗?那就是空行
不信你可以在sql窗口执行,就明显了
sum不是的
一定会的!
SQL> select nvl(sum(0), 0) from dual where 1 <> 1;
NVL(SUM(0),0)
-------------
0
NVL(SUM(0),0)
-------------
你不要只是看工具的sql文执行结果,
那个只是为了让你看的方便而已
你用程序执行sql文,然后取结果看看,这个是不会有问题的
在没有group by子句时,即使不存在满足条件行也返回一行空值,加了group by子句就无返回了.
感觉跟bug一样
额滴个神,我刚做查询的时候也遇到这个问题
我再最后面加了一句
GROUP BY 1就可以了
GROUP BY 什么貌似都可以,感觉就是用GROUP BY 来去除空记录用的
lz的sql的效率