为什么我在这个MySQL问题中不能返回null?

问题描述 投票:0回答:1

LeetCode问题

下面是我的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
的评估是什么?

mysql
1个回答
0
投票

第一次查询:

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

结果:

数字
© www.soinside.com 2019 - 2024. All rights reserved.