问题
在项目中使用 Mysql
中的 sum()
函数求和时,调试时发现报出下面的错误信息:
sql: Scan error on column index 0, name "total": converting NULL to int64 is unsupported
我相应执行的sql语句如下:
1 | SELECT SUM(consume) as total FROM user_income WHERE consume_type=3 AND uid=20; |
验证
为了找到原因,我在 Navicat
中执行了一遍出问题的sql和参数,发现结果中确实是返回了 null
:
按我之前开发时的想法:
- 如果有相应的数据,返回求和后的值
- 如果没有符合条件的数据,返回
0
结果,当没有符合条件的数据时却返回了 null
。
解决
可以通过结合使用 ISNULL
或 COALESCE
函数来解决。
相应的示例如下:
1 | SELECT IFNULL(SUM(Column1), 0) AS total FROM... |
区别
上面说道,使用 ISNULL
或 COALESCE
函数都可以解决为 null
的问题,那么这两个函数有什么区别呢?
ISNULL
函数接受两个参数,如果第一个参数不是null
会直接返回,如果第一个参数是null
,则返回第二个参数COALESCE
函数可以接受两个或多个参数,并返回第一个非null
的参数,如果所有参数都为null
,则会返回null
结果
最终,我选择使用 ISNULL
来解决:
1 | SELECT IFNULL(SUM(consume), 0) as total FROM user_income WHERE consume_type=3 AND uid=20; |