首页 > 解决方案 > 在MySql自定义函数中选择前一个

问题描述

我想要一个函数,给定 N 返回按列Products排序的表中的第 N-1 个产品名称Sales

Products

CREATE TABLE Products(
    ID int NOT NULL,
    Name varchar(255) NOT NULL,
    Sales int NOT NULL,
    PRIMARY KEY (ID)
);

我当前的函数定义:

CREATE FUNCTION getName(X INT) RETURNS varchar(255)
BEGIN
  RETURN (
      SELECT 
        Name
      FROM Products
      ORDER BY Sales
      LIMIT 1 OFFSET X - 1
  );
END

但它给了我一个语法错误X - 1。如何将减号运算符与自定义函数参数一起使用。对于我的用例,我需要在函数内部而不是外部进行否定。(运行 mysql 5.7)。

tldr:

为什么会OFFSET X - 1抛出语法错误,还有什么替代方法?

标签: mysqllimit

解决方案


https://dev.mysql.com/doc/refman/8.0/en/select.html说:

在存储的程序中,LIMIT可以使用整数值的例程参数或局部变量来指定参数。

换句话说,LIMIT 和 OFFSET 不接受像X - 1.

你可以这样做:

CREATE FUNCTION getName(X INT) RETURNS varchar(255)
READS SQL DATA
BEGIN
  DECLARE local_offset INT;
  SET local_offset = X - 1;
  RETURN (
      SELECT
        Name
      FROM Products
      ORDER BY Sales
      LIMIT 1 OFFSET local_offset
  );
END

推荐阅读