记一次赤裸裸的教训:All elements are null

449 阅读2分钟

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”这种情况。