SQL:Sum返回null

时间:2015-04-21 11:58:50

标签: mysql sql

所以我有两张桌子academy_attempt& module_attempt

我试图从这些表中的每一个中添加两个值:

        round(((select 
                    sum(`academy_attempt`.`score`)
                from
                    `academy_attempt`
                where
                    ((`academy_attempt`.`module_type_id` in (3 , 4, 5, 6))
                        and (`academy_attempt`.`user_id` = `U`.`id`))) + (select 
                    sum(ifnull(`module_attempt`.`score`, 0))
                from
                    `module_attempt`
                where
                    ((`module_attempt`.`module_type_id` in (3 , 4, 5, 6))
                        and (`module_attempt`.`user_id` = `U`.`id`)))),
            2) AS `total_score`

在academy_attempt中满足where语句,并在一行中返回正确的数量(如果它是单独的)但是module_attempt没有任何与where语句匹配的值,因此返回null。

可悲的是,这并没有变成0,因为我猜你不能进行操作:17 + null = 17而是返回null

为了解决这个问题,我尝试了IFNULL语句,如上所示,但遗憾的是,这并没有解决问题

2 个答案:

答案 0 :(得分:2)

您必须将IFNULL()更高一些,因为空结果集被视为null

SELECT (... 
) + IFNULL((SELECT SUM(`module_attempt`.`score`) ...), 0) AS total_score

答案 1 :(得分:1)

NULL表示未知值,因此自然地尝试向数字添加未知值仍然会导致未知值,尽管是不同的未知值(因此NULL != NULL

我认为你实际上想要COALESCE函数,它返回第一个非null参数。因此,您可以使用此函数包装null值,并将其与正常值相加。 COALESCE( NULL, 0 )将返回0COALESCE(1,0)将返回1

https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce