MySQL查询无结果时如何返回默认值(如0)?
解决MySQL无查询结果时返回默认值的问题
你的问题核心在于:当WHERE条件没有匹配到任何记录时,整个SELECT语句不会返回任何行——这时候你写的IF函数根本没机会执行,它只能处理已经存在的行里的字段值是否为空的情况。下面给你两种实用的解决方案:
方法一:用子查询+IFNULL(精准匹配最新记录)
如果你要的是符合条件的最新那条记录的value,没找到就返回0,可以这么写:
SELECT IFNULL( (SELECT value FROM globals WHERE expire_date >= '2018-04-25' ORDER BY id DESC LIMIT 1), 0 ) AS goal;
逻辑很简单:先尝试通过子查询获取符合条件的最新value,如果子查询返回NULL(也就是没找到任何记录),就用IFNULL把它替换成0,最终一定会返回一行结果。
方法二:聚合函数+IFNULL(简洁通用)
如果不需要严格限定最新记录,只是要符合条件的value(或者随便取一个),用聚合函数更简洁:
SELECT IFNULL(MAX(g.value), 0) AS goal FROM globals AS g WHERE g.expire_date >= '2018-04-25';
聚合函数比如MAX()、MIN()在没有匹配行时会返回NULL,再用IFNULL转成0即可。如果你还是要最新的,MAX(g.value)配合ORDER BY id DESC的效果和子查询一致,因为最新的id对应的value会被MAX取到。
为什么原查询不生效?
再帮你理清楚原查询的问题:当WHERE条件筛选后没有任何记录,整个查询就没有输出行,IF(g.value IS NULL, 0, value)这个逻辑是针对每一行的value字段,而不是针对“没有行”的情况。只有当查询返回了行,但该行的value是NULL时,这个IF才会返回0,但如果连行都没有,自然什么都输出不了。
内容的提问来源于stack exchange,提问作者jhon dano
相关产品推荐
相关产品推荐

