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

为何LeetCode第N高薪资函数返回NULL,第二高薪资查询无结果?

关于LeetCode中「第N高薪资」与「第二高薪资」查询结果差异的疑问

在LeetCode做SQL题目时遇到一个疑问:在「第N高薪资」的函数解决方案中,当N超过表中不同薪资的数量时会返回NULL;而「第二高薪资」的直接查询语句,在类似场景(如表中不足2个不同薪资)时仅返回空结果而非NULL。附上两道题的解决方案,想了解该差异的原因。

「第N高薪资」解决方案

CREATE FUNCTION getNthHighestSalary(N INT) 
RETURNS INT
BEGIN
set N = N-1;
  RETURN (
      # Write your MySQL query statement below.
        SELECT DISTINCT salary
        FROM Employee
        ORDER BY salary DESC
        limit N, 1
  );
END

「第二高薪资」解决方案

SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1, 1

差异原因解析

  • 函数返回类型的强制约束:你定义的getNthHighestSalary函数明确声明了RETURNS INT,这要求函数必须返回一个整数类型的值。当内部的SELECT语句查询不到匹配结果(返回空集)时,函数会自动将空集转换为NULL——因为函数无法返回“无结果”的状态,必须输出一个符合声明类型的值。
  • 直接SELECT语句的原生行为:单独执行的SELECT语句如果没有匹配到任何行,会直接返回空结果集(即没有数据行),而非NULL。这是SQL查询的原生逻辑:查询结果是一个数据集,无匹配时就是空的,不会自动生成NULL值填充。
  • 结果处理逻辑的差异:函数方案借助返回类型的规则,间接完成了空结果到NULL的转换;而直接查询的LIMIT 1,1在没有足够行可返回时,就直接输出空结果,没有额外的转换逻辑。

如果想让「第二高薪资」的查询也返回NULL,可以用子查询包裹原语句,让外部查询将空结果转为NULL,示例:

SELECT (
    SELECT DISTINCT salary 
    FROM Employee 
    ORDER BY salary DESC 
    LIMIT 1, 1
) AS SecondHighestSalary

内容的提问来源于stack exchange,提问作者Sagar Dwevedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:13:10