单个数字是在 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;
为什么上面的查询没有返回空值,如果没有单个数字
我期待为非单数测试用例显示空值,但它显示空表
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,了解分步解决方案。
写一个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;
你的查询没有返回任何行。由于您的原始查询最多返回一个标量,因此最简单的方法是将其设为表达式
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
如果你的结果集不包含任何行,你不能返回空值,因为这仍然需要返回一行和一个值来操作。
如果您想在没有符合条件的行的情况下返回 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;
一些小提琴的例子