问题描述
我有一张这样的桌子:
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
我正在用MysqL编写一个函数,以获取Salary中的第n个最大值。 这是函数:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MysqL query statement below.
select disTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 offset (N - 1)
#FETCH NEXT 1 ROWS ONLY
);
END
如果我将(N-1)更改为1:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MysqL query statement below.
select disTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 offset 1
#FETCH NEXT 1 ROWS ONLY
);
END
它可以正常运行。 那么问题是如何在sql函数中引用输入?似乎可以像在其他语言中一样直接将其称为参数。
解决方法
LIMIT参数不能为变量。使用准备好的语句-LIMIT参数可以从变量中获取。但是该函数中不允许使用动态SQL-使用存储过程:
CREATE PROCEDURE getNthHighestSalary(N INT)
BEGIN
SET @sql := 'SELECT DISTINCT Salary
INTO @output
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET ?';
PREPARE stmt FROM @sql;
SET @output := N-1;
EXECUTE stmt USING @output;
DROP PREPARE stmt;
SELECT @output;
END
,
似乎我需要在SQL查询中引用它之前声明并设置一个变量:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE M INT;
SET M=N-1;
RETURN (
# Write your MySQL query statement below.
select DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET M
#FETCH NEXT 1 ROWS ONLY
);
END