带有IS NULL的CASE未按预期替换

时间:2018-04-10 10:50:01

标签: mysql

我有一个带有一些数字的简单列,看起来像;

133
8
55
11
NULL
NULL
235
NULL

我想在选择此列时设置默认值,目的是替换空值。我做完了;

 CASE
        WHEN round(avg(s.seconds)) IS NULL THEN 0
        ELSE round(avg(s.seconds))

 END as 'seconds'

但是,我的空值仍然存在。我的期望是它们会被设置为0.为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

平均计算中忽略NULL值。

如果要在平均值中将NULL值替换为0,则需要在平均函数内的值上使用COALESCE。示例如下:

DROP TEMPORARY TABLE IF EXISTS TEMP1;

CREATE TEMPORARY TABLE TEMP1
SELECT 1 AS price
UNION ALL SELECT NULL AS price
UNION ALL SELECT NULL AS price
UNION ALL SELECT 3 AS price;

SELECT * FROM TEMP1; # List values (1, NULL, NULL, 3)
SELECT AVG(price) FROM TEMP1; # Returns 2 (NULL values IGNORED)
SELECT AVG(COALESCE(price,0)) FROM TEMP1; # Returns 1 (NULL values REPLACED with 0)

答案 1 :(得分:0)

您可以通过3种方式完成

<强> 1

round(avg(CASE
               WHEN s.seconds IS NULL THEN 0
               ELSE s.seconds
           END)) as 'seconds'

<强> 2

  

MySQL IFNULL()功能可让您返回替代值   表达式为NULL:

round(avg(IFNULL(s.seconds,0)))

第3

  

或者我们可以使用 COALESCE()功能,如下所示:

 round(avg(COALESCE(s.seconds,0)))