不确定下面的问题“最大单数”的查询有什么问题来自leetcoode

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

单个数字是在 MyNumbers 表中只出现一次的数字。

写一个SQL查询来报告最大的单个数。如果没有单个数字,则报告为空。

查询结果格式如下例

例一:

Input: 
MyNumbers table:
+-----+
| num |
+-----+
| 8   |
| 8   |
| 3   |
| 3   |
| 1   |
| 4   |
| 5   |
| 6   |
+-----+
Output: 
+-----+
| num |
+-----+
| 6   |
+-----+

解释:单数为1、4、5、6。 由于 6 是最大的单个数字,我们返回它。

我的查询:

select  ifnull(num,null) as num 
from MyNumbers 
group by num
having count(num)=1
order by num desc
limit 1;

为什么上面的查询没有返回空值,如果没有单个数字

我期待为非单数测试用例显示空值,但它显示空表

sql mysql database coding-style rdbms
4个回答
0
投票

count(num) 将返回

0
空值。这可以通过使用
count(*)
来解决:

select  ifnull(num,null) as num 
from MyNumbers 
group by num
having count(*)=1
order by num desc
limit 1
;

请参阅 DBFIDDLE,了解分步解决方案。


0
投票

写一个SQL查询来报告最大的单个数

好吧,

group by num having count(*) = 1
就可以了。这是棘手的部分:

如果没有单号,报null。

having
将过滤掉所有没有计数的行。因此,如果没有计数为 1 的数字,则结果集中有 0 行。这与一行
null
的结果不同。

旁白:除了运动之外,这是一个愚蠢的要求。将

null
与空结果集混为一谈是没有意义的。空结果集是表示缺少匹配数据的正确方式。好吧,毕竟这只是一个练习。

这是我的简单解决方案。我只是

union
select
MyNumbers
上选择
null
的结果。现在结果集中有一个
null
,如果结果集中没有其他结果,则
null
是唯一出界的。如果有数字,则返回该数字。

select num from MyNumbers  num group by num having count(num) = 1 
union select null as num
order by num desc limit 1;

0
投票

你的查询没有返回任何行。由于您的原始查询最多返回一个标量,因此最简单的方法是将其设为表达式

select (<original scalar query>) as res

select (
    select num 
    from MyNumbers 
    group by num
    having count(num)=1
    order by num desc
    limit 1
    ) res

0
投票

如果你的结果集不包含任何行,你不能返回空值,因为这仍然需要返回一行和一个值来操作。

如果您想在没有符合条件的行的情况下返回 NULL 值,您可以创建两个集合的并集:

with n as (
  select num 
  from t 
  group by num
  having count(*) = 1
  union all select null
)
select num
from n
order by num desc
limit 1;

也可以使用case表达式来测试行数并返回null,这需要至少有一些数据存在

select case when Count(*)> 1 then null else num end Num
from t 
group by num
order by Count(*), num desc
limit 1;

一些小提琴的例子

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