如果没有记录,如何选择sum -or- 0?

ewo*_*wok 34 mysql sum

我需要编写一个查询,返回满足特定条件的所有值的总和,但如果没有找到行,查询需要返回0,而不是null.例如:

tab    
+---------------+-----+
| descr         | num |
+---------------+-----+
| hello there   | 5   |
| hi there      | 10  |
| hello         | 10  |
| hi there!     | 15  |
+---------------+-----+
Run Code Online (Sandbox Code Playgroud)

这个查询:

SELECT sum(num) AS val FROM tab WHERE descr LIKE "%hello%";
Run Code Online (Sandbox Code Playgroud)

应该而且确实会回来15.然而:

SELECT sum(num) AS val FROM tab WHERE descr LIKE "%greetings%";
Run Code Online (Sandbox Code Playgroud)

应该返回0,但确实返回null.

有人可以解释一下这是否可能?

Mik*_*sen 73

怎么样:

SELECT COALESCE(sum(num), 0) AS val FROM tab WHERE descr LIKE "%greetings%";
Run Code Online (Sandbox Code Playgroud)

COALESCE函数基本上说"返回的第一个参数,除非它是空在这种情况下返回第二个参数" -这是在这些情况下,会非常方便.

  • 这是行不通的。如果没有要聚合的行,则甚至不会调用“coalesce”。我不明白这怎么会有 122 票赞成。 (12认同)
  • 这实际上并没有达到预期的效果 - 这也会掩盖作为“num”值本身一部分的“NULL”。 (3认同)

ses*_*ser 10

查看有关IFNULLMySQL文档.

SELECT SUM(IFNULL(num, 0)) as val FROM tab WHERE descr LIKE "%greetings%";
Run Code Online (Sandbox Code Playgroud)

当然,这假设您的num字段可以为空并且没有默认值.另一种可能的解决方案是0为num字段设置一个默认值,它应该解决你遇到的问题.

  • IFNULL应该在SUM之外,否则如果没有找到行,它将返回null. (10认同)

Den*_*sky 6

最短的方法是:

SELECT IFNULL(SUM(num), 0) as val FROM tab WHERE descr LIKE "%greetings%";
Run Code Online (Sandbox Code Playgroud)