微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在SQL函数中引用输入?

如何解决如何在SQL函数中引用输入?

我有一张这样的桌子:

+----+--------+
| 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)附近遇到一个错误

enter image description here

如果我将(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

fiddle

,

似乎我需要在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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。