wshanshi:记一次赤裸裸的教训…All elements are null…
一、异常信息
数据库查询统计相关业务,未使用分组group by,仅单独使用聚合函数。如下图所示,使用了SUM()函数。
假如数据库中未匹配到相关数据,结果集用List接收。大家认为返回的结果应该是什么?list.size()会是0?还是1?
楼主第一反应就是:肯定size=0啊!然而,事实证明还是太年轻,结果还真不一定是咱以为的那样!list的size=1,有一条数据,但是数据中的所有值都是null。出现了:All elements are null
把sql运行了一下,发现返回的结果集是这样的。
运行一下不使用聚合函数的sql语句,如下图所示。
未查询到数据,且正常返回的为(N/A)这种。
好家伙,好像明白了什么…
使用sum()函数求和时,会对 null 进行过滤(假如总共10条数据:8条有值,2条无值那种),不进行计算。但是,如果所有值都为null,返回的求和结果也会是null,不会是0。
楼主遇到的这种情况,就是空值进行了sum,就会返回null。
二、解决方法
单独使用聚合函数的时候,一定要注意null值情况。
2.1、方法一、sql中控制
2.1.1、SqlServer数据库
可使用ISNULL(param1,param2)函数进行解决。
ISNULL函数有两个参数,param1表示判断这个参数的值是否为NULL,是NULL返回true,否则返回false。param2表示默认值,param1为空值进行赋值。
效果如下:
2.1.2、MySql数据库
mysql中使用IFNULL()函数,效果同上2.1.1。
2.2、方法二、处理方法中解决
对于查询的结果集,移除所有的null元素
list.removeAll(Collections.singleton(null));
三、类似情况
关联查询有时候也会出现类似情况。
尤其是left join、right join时容易出现部分字段空值。若此时,刚好查询出来进行sum的字段都是null,也可能会出现:“All elements are null”这种情况。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115740.html