为何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
相关产品推荐
相关产品推荐

