sql—mysql函数中返回块的限制

f4t66c6m  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(328)

我正在处理一个leetcode问题,该问题要求用户从名为 Employee 带列 Id 以及 Salary .
给用户的开始代码是

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)

但显然这不管用。成功的查询在返回块外定义另一个变量m=n-1,然后使用 OFFSET M .
我的问题是:
这里涉及的原则是什么?显然,在返回块中允许执行的操作有一些限制。
一个参考是完全正确的;一些搜索没有任何结果。

fcy6dtqo

fcy6dtqo1#

简而言之:你不能使用 offset (N-1) 因为语法不允许(你应该得到一个语法错误)。
一般来说, limit 以及 offset 预期实际数字:
limit子句可用于约束select语句返回的行数。limit接受一个或两个数值参数,这两个参数都必须是非负整数常量。
尽管在存储过程中存在异常:
在存储程序中,可以使用整数值例程参数或局部变量指定限制参数。
所以你可以在那里使用变量,但不能使用表达式。这就是为什么如果使用预先计算的变量 M 相反。

ig9co6j1

ig9co6j12#

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 ;

函数返回一个整数,因为您只选择了一个限制为1的值。
包含两行的结果集将产生错误。
我之所以添加确定性是因为mysql需要一个选项
表也不能用作返回值。
如果要返回更多变量,必须在n int之后添加用户定义的变量,这可以在调用函数的seelct中使用

相关问题