【问题标题】:want to use case statement at the order by想要按顺序使用 case 语句
【发布时间】:2019-12-16 20:17:05
【问题描述】:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (

     SELECT DISTINCT(Salary) 
     FROM Employee 
     ORDER BY 
     (case
         when N<=0 then Salary  END DESC LIMIT 0,1,
         when N >0 then Salary  END DESC LIMIT N-1,1) 



  );
END

我想按订单使用 case 语句
当 N N>0 然后用 LIMIT N-1,1 描述

【问题讨论】:

  • 你只能在一个函数中返回 1 个值 - 你到底想做什么?
  • 找到第 N 个最高薪水,但是当 N 小于 0 时,它会给出负数错误,然后我尝试使用 case when
  • 也许你应该返回光标!
  • @Nyamkhuu Buyanjargal 我们离需要光标还有一段距离。

标签: mysql


【解决方案1】:

'LIMIT 接受一个或两个数字参数,它们都必须是非负整数常量''在存储程序中,LIMIT 参数可以使用整数值的例程参数或局部变量来指定。 https://dev.mysql.com/doc/refman/8.0/en/select.html 我的意思是你不能对你的例行参数和 您确实收到语法错误(您应该在问题中包含该错误)。我只是分开处理 n

drop function if exists f;
delimiter $$
CREATE FUNCTION f(N INT) 
RETURNS INT
BEGIN
   if n > 0 then 
        set n = n - 1 ; 
    else
        set n = 0;
    end if;
  RETURN 

     (SELECT DISTINCT(Salary) 
     FROM Employees 
     ORDER BY 
     salary desc limit n,1 
   ) ;
END $$
delimiter ;

select distinct(salary) from employees order by salary desc limit 4;
+--------+
| salary |
+--------+
|  39500 |
|  19500 |
|  16000 |
|  14000 |
+--------+
4 rows in set (0.00 sec)

select f(1), f(-1),f(-10),f(2), f(3),(f4); 

+-------+-------+--------+-------+-------+-------+
| f(1)  | f(-1) | f(-10) | f(2)  | f(3)  | f(4)  |
+-------+-------+--------+-------+-------+-------+
| 39500 | 39500 |  39500 | 19500 | 16000 | 14000 |
+-------+-------+--------+-------+-------+-------+
1 row in set (0.00 sec)

【讨论】:

  • 谢谢。有没有办法用case whenstatement做到这一点?
  • 而不是 if 语句?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2011-12-16
相关资源
最近更新 更多