MySQL 函数中 RETURN 块的限制

Limitations to the RETURN block in a MySQL function

我正在研究 LeetCode problem,它要求用户 return 来自 table 的第 N 个最高薪水,名为 Employee,列为 IdSalary.

给用户的起始代码是

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      # Write your MySQL query statement below.
      
  );
END

诱惑是放像

  SELECT e.salary as getNthHighestSalary
  FROM employee e
  ORDER BY e.salary DESC
  LIMIT 1 OFFSET (N-1)

但显然那是行不通的。成功的查询在return块外定义了另一个变量M=N-1,然后使用OFFSET M.

我的问题:

What is the principle involved here? Clearly there are some limitations as to what operations you're allowed to do inside the return block.

参考完全没问题;一些搜索没有产生任何结果。

DELIMITER //
CREATE FUNCTION getNthHighestSalary2(N INT) RETURNS INT
DETERMINISTIC
BEGIN
  RETURN
   (SELECT salary 
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET N);
  
END//
DELIMITER ;

函数return一个整数,因为你select只有1个值LIMIT 1.

包含两行的结果集会产生错误。

我添加的 DETERMINISTIC 因为 mysql 想要一个选项

也不能将表格用作 return 值。

如果你想return更多的变量,你必须在N INT后添加用户定义变量,可以在你调用函数的SEELCT中使用

简而言之:您不能在那里使用 offset (N-1),因为语法不允许。 (你应该得到一个语法错误)。

一般来说,limit and offset预计实际人数:

The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants.

虽然在存储过程中存在异常:

Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables.

所以你可以在那里使用变量,但不能使用表达式。这就是为什么如果您改用预先计算的变量 M 它会起作用的原因。