mysql - 我的查询何时返回 null? (N最高薪资问题)

标签 mysql sql

编写一个 SQL 查询以从 Employee 表中获取第 n 个最高薪水。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

例如,给定上面的 Employee 表,n = 2 时第 n 个最高工资为 200。如果没有第 n 个最高工资,则查询应返回 null。

+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

此解决方案失败

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

上述解决方案未通过此案例 enter image description here

enter image description here

接受的解决方案:

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 enter image description here

最佳答案

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

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

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;

Here是一个 reextester,表明它可以工作。

关于mysql - 我的查询何时返回 null? (N最高薪资问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53306266/

相关文章:

php - 如何显示数据库中存储的图像?

php - 如何在 PDO 中存储变量

sql - 如何在 Oracle Select 中获取列中的邻近数字

php - 内连接 MySQL 表仅产生第一行

mysql - MySQL 中何时使用单引号、双引号和反引号

php - 元表效率低下

java - 如何将 android 应用程序连接到非本地的 mysql 数据库?

sql - 选择重复两次的记录!

mysql查询条件选择额外数据

sql - 将标签数组传递给 plpgsql 函数并在 WHERE 条件下使用它