为什么当exp为”空“时,IFNULL(exp,null)无法返回null。
前情提要
什么情景下会发生该问题
比如我们要找出一个表中只出现过一次的最大数字。如果没找到则返回NULL(Leetcode题目)。 又或者是找出某个不等于特定值的数,这个时候用IFNULL,很合理也很容易想到。
比如我们要找出不等于0的数,如果没找到就返回NULL。
- SELECT IFNULL(num,null) AS num
- FROM MyNumbers
- WHERE num!=0
However,这条SQL没用。你会发现返回的是空值,而不是null。这里为了方便直接复制leetcode的输出
- 输入
- MyNumbers =
- | num |
- | --- |
- | 0 |
-
- 输出
- | num |
- | --- |
为啥呢?如果表中的所有数都等于0,那么按照SQL语句的执行顺序,FROM->WHERE->SELECT,在WHERE筛选后num不就为null了吗?为什么IFNULL无法返回后值null呢?
为啥在WHERE之后就不生效了?先思考一下,WHERE筛选之后的结果集是NULL吗?
如是。它真的是NULL吗?如是。WHERE筛选后确实没有匹配的记录,那它的结果集里面会有NULL吗?很明显不会,单纯就是啥都没有,即emptyset,空值的集合。
而IFNULL是干什么的?对于IFNULL(exp,value)来说,当exp的结果为NULL,才会返回value。而不是当exp的结果为空值(N/A)时,返回value。
要解决这个问题也很简单,加个聚合函数完事。最直接的就是加个MAX,MAX对emptyset计算,发现找不到任何一条记录,诶,那它就返回个NULL,完事。
- SELECT IFNULL(MAX(num),null)AS num
- FROM MyNumbers
- WHERE num!=0