You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的常用方法

  1. 利用聚合函数:MAX()、MIN()、AVG()等聚合函数在没有匹配行时,会返回NULL且生成一行结果,这是最常用的方法。
  2. UNION ALL 补充空行:在查询末尾加上UNION ALL SELECT NULL,保证结果集至少有一行,再结合TOP 1或聚合函数筛选需要的值。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:40:08