好吧,我OUT了。因为以前基本上是用php对数据结果的同一行进行计算,居然没注意sql语言中 select 1+Null 的结果会是Null, 好在测试细心发现了问题。本人看我的有关sql的书中都好像没有讲这一点,如果谁知道哪本书写了这点,希望能把书名告诉我下—— 《阿里 java开发手册有写》
3. 【强制】当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为
NULL,因此使用 sum()时需注意 NPE 问题。
正例:可以使用如下方式来避免 sum 的 NPE 问题:SELECT IFNULL(SUM(column), 0) FROM table;
关于IFNULL, 我已经给阿里 java开发手册提了建议 https://github.com/alibaba/p3c/issues/776
关于SQL 在数值计算时对 NULL 的处理及解决办法,使用 COALESCE 函数就可以了(IFNULL不是sql标准, 只有实现mysql的数据库能用),复杂些的用sql的 if 或者 case when表达式。
当然, 比较好的办法是在设计数据库时防范于未然,把数值类型设置成不能为Null,并默认为0; 关联表时尽量写inner join,如果有left join之类的情况,就要注意空值的出现, 进行防御式的编程。
我在写SQL时,要经常判断字符串类型是否是Null或'', 显然在插入数据时,如果是'',转成Null插入,也是可以避免的。