下面是我的SQL
SELECT (CASE WHEN COUNT(num) = 1 THEN num ELSE NULL END) num
FROM MyNumbers
GROUP BY num
HAVING COUNT(num) = 1
ORDER BY num DESC
LIMIT 1;
我也尝试过另一种方式,
SELECT IFNULL(num,null) num
FROM MyNumbers
GROUP BY num
HAVING COUNT(num) = 1
ORDER BY num DESC
LIMIT 1;
对于下面的测试用例,
num = |8,8,7,7,3,3|
由于
HAVING
过滤器后没有候选者,因此我的查询中不会显示任何行。并且,处理这种情况的预期答案(答案中没有行)如下所示,
|num|
|---|
|null|
为什么我的上述两种方法不起作用?有人可以解释一下吗?
当
IFNULL(num,null)
函数中的列中没有行时到底发生了什么,看似没有行 num 不为空,那么 num
中 IFNULL
的评估是什么?
第一次查询:
SELECT (CASE WHEN COUNT(num) = 1 THEN num ELSE NULL END) num
FROM MyNumbers
GROUP BY num
HAVING COUNT(num) = 1
ORDER BY num DESC
LIMIT 1;
COUNT(num) = 1
,因此 HAVING
会排除所有内容,导致不返回任何行。第二次查询:
SELECT IFNULL(num,null) num
FROM MyNumbers
GROUP BY num
HAVING COUNT(num) = 1
ORDER BY num DESC
LIMIT 1;
HAVING
拟合出所有内容,没有返回任何记录。解决方案:
聚合函数将过滤唯一的
num
,确保在不存在 null
的情况下返回 num
。
SELECT MAX(num) AS num
FROM (
SELECT num
FROM MyNumbers
GROUP BY num
HAVING COUNT(*) = 1
) unique_num
结果:
数字 |
---|
空 |