LeetCode最大唯一数问题:如何让T-SQL查询返回NULL?
获取最大唯一数:空表转返回NULL的问题解决
问题背景
需求是从MyNumbers表中找出无重复的最大数值,如果不存在这样的数(即所有数值都重复),则返回NULL。当前测试数据所有数值均重复,预期输出一行NULL,但现有查询返回空表。
测试数据:
| num |
|---|
| 8 |
| 8 |
| 7 |
| 7 |
| 3 |
| 3 |
当前输出:空表
预期输出:
| num |
|---|
| NULL |
现有代码的问题
你的CTE2在没有符合条件的唯一数时,会返回空结果集。外层SELECT查询空结果集时,不会生成任何行,自然无法输出NULL。CASE语句只有在CTE2有行时才会执行,空结果集下根本不会触发这个逻辑。
修改方案
方案1:用聚合函数直接生成结果(最简洁)
利用聚合函数MAX()的特性:当子查询没有返回任何行时,MAX()会返回NULL,且保证结果集有一行数据。
SELECT MAX(num) AS num FROM ( -- 先筛选出所有无重复的数值 SELECT num FROM MyNumbers GROUP BY num HAVING COUNT(*) = 1 ) AS UniqueNumbers
方案2:修改原CTE逻辑,确保结果集至少有一行
在CTE2中加入UNION ALL SELECT NULL,保证即使没有唯一数,也会有一行NULL,再取最大的那个(逻辑上唯一数肯定比NULL大,所以有唯一数时会取到正确值,没有时取NULL):
WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY num ORDER BY num) AS RN FROM MyNumbers ), CTE2 AS ( -- 取最大的唯一数 SELECT TOP 1 num FROM CTE WHERE num NOT IN (SELECT num FROM CTE WHERE RN >= 2) ORDER BY num DESC -- 没有唯一数时补充一行NULL UNION ALL SELECT NULL ) -- 取CTE2中的最大值,确保有唯一数时取数值,否则取NULL SELECT MAX(num) AS num FROM CTE2;
SQL中手动返回NULL的常用方法
- 利用聚合函数:
MAX()、MIN()、AVG()等聚合函数在没有匹配行时,会返回NULL且生成一行结果,这是最常用的方法。 - UNION ALL 补充空行:在查询末尾加上
UNION ALL SELECT NULL,保证结果集至少有一行,再结合TOP 1或聚合函数筛选需要的值。 - LEFT JOIN 虚拟表:将查询结果与一个包含单行的虚拟表(如
SELECT 1 AS dummy)左连接,确保即使原查询为空,也会返回一行,再用COALESCE处理:SELECT COALESCE(U.num, NULL) AS num FROM (SELECT 1 AS dummy) D LEFT JOIN ( SELECT TOP 1 num FROM MyNumbers GROUP BY num HAVING COUNT(*) = 1 ORDER BY num DESC ) U ON 1=1
内容的提问来源于stack exchange,提问作者Aztec-3x5
相关产品推荐
相关产品推荐

