首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的查询何时返回null?(N最高薪金问题)

我的查询何时返回null?(N最高薪金问题)
EN

Stack Overflow用户
提问于 2018-11-14 18:01:36
回答 1查看 442关注 0票数 0

编写SQL查询,从Employee表中获得第9位最高薪资。

代码语言:javascript
复制
+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

例如,在上面的雇员表中,n=2的第n最高工资是200。如果没有第n个最高工资,那么查询应该返回null。

代码语言:javascript
复制
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

此解决方案失败

代码语言:javascript
复制
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN

RETURN(
    SELECT Salary
    FROM (SELECT * FROM Employee ORDER BY Salary DESC LIMIT N)  
    AS TEMP   
    ORDER BY Salary ASC LIMIT 1

  );
END

上面的解决方案没有通过这个案例,

接受的解决方案:

代码语言:javascript
复制
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  DECLARE M INT;
  SET M = N - 1;
  RETURN(

  SELECT DISTINCT Salary FROM Employee ORDER by Salary DESC LIMIT M, 1

  );
END

我的问题是,当表中只有一个值时,为什么接受的解决方案可以返回null?谢谢

顺便说一下,这个问题使用MySQL

EN

回答 1

Stack Overflow用户

发布于 2018-11-14 19:27:48

它失败,因为子查询总是返回一组行,即使没有"n“行。

可能最简单的方法是使用offset/limit

代码语言:javascript
复制
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    SET v_offset = N - 1;
    RETURN(SELECT Salary
           FROM Employee
           ORDER BY Salary DESC
           LIMIT 1 OFFSET v_offset
          );
END;

这里是一个rextester,显示了它的工作原理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53306266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档