【问题标题】:MySQL Conditional ASC/DESCMySQL 条件 ASC/DESC
【发布时间】:2015-04-17 19:47:48
【问题描述】:

我正在尝试创建一个存储过程,以便可以轻松地按升序或降序对一些数据进行排序。我浏览了整个互联网,终于让 MySQL 接受了我正在尝试做的事情,但是现在当我调用该过程时,它会产生垃圾数据。如果我自己运行查询,一切都会完美运行。我究竟做错了什么?这是我的代码:

DROP PROCEDURE IF EXISTS OrderPlants;

DELIMITER //

CREATE PROCEDURE OrderPlants (IN OrderSeq CHAR(4))

BEGIN

SELECT Location.State, Operator.Name, Plant.TotalOutput
FROM Plant

INNER JOIN Location
ON Plant.LocationID = Location.ID

INNER JOIN Operator
ON Plant.OperatorID = Operator.ID

ORDER BY 
CASE WHEN @OrderSeq = 'ASC' THEN Plant.TotalOutput END ASC,
CASE WHEN @OrderSeq = 'DESC' THEN Plant.TotalOutput END DESC

LIMIT 5;

END //

DELIMITER ;

这是它产生的输出:

MariaDB [nuclear]> call orderplants ('ASC');
+-------+-----------------------------+-------------+
| State | Name                        | TotalOutput |
+-------+-----------------------------+-------------+
| FL    | Florida Power & Light Co.   |        6040 |
| IA    | CORN BELT POWER COOP        |          38 |
| KY    | DUKE ENERGY KENTUCKY INC    |         648 |
| IN    | JASPER MUNICIPAL UTIL (IN)  |          15 |
| OH    | FIRSTENERGY GENERATION CORP |          18 |
+-------+-----------------------------+-------------+
5 rows in set (0.01 sec)

Query OK, 0 rows affected (0.04 sec)

如果使用 DESC 输入调用该过程,数据应如下所示:

+-------+--------------------------------+-------------+
| State | Name                           | TotalOutput |
+-------+--------------------------------+-------------+
| AZ    | Arizona Public Service Company |       11970 |
| AL    | Tenessee Valley Authority      |       10374 |
| PA    | PPL Susquehanna, LLC           |        7904 |
| TX    | STP Nuclear Operating Co.      |        7706 |
| SC    | Duke Energy Carolinas, LLC     |        7704 |
+-------+--------------------------------+-------------+
5 rows in set (0.00 sec)

ASC 输入的输出应该是什么:

+-------+-------------------------------+-------------+
| State | Name                          | TotalOutput |
+-------+-------------------------------+-------------+
| PA    | KOPPERS CO                    |           3 |
| MN    | NORTHERN STATES POWER CO (MN) |           7 |
| MN    | AMERICAN CRYSTAL SUGAR CO     |           8 |
| IA    | MIDAMERICAN ENERGY CO         |           8 |
| IN    | JASPER MUNICIPAL UTIL (IN)    |          15 |
+-------+-------------------------------+-------------+
5 rows in set (0.01 sec)

【问题讨论】:

  • totaloutput的数据类型是INT
  • 如果你用 'ASC' 调用它是否会做同样的事情,这意味着最后是一个空格?因为 CHAR(4) 总是 4 个字符,而 ASC 只有 3 个。
  • 也许CASE WHEN OrderSeq = 'ASC' 没有@
  • 删除@修复它。非常感谢!
  • 是否(ASC/DESC)工作正常?

标签: mysql sql procedure mariadb


【解决方案1】:

你可以试试这样的:

ORDER BY if(@OrderSeq = 'ASC', Plant.TotalOutput, -Plant.TotalOutput)

这里是小提琴样本http://sqlfiddle.com/#!9/60b4e/7

【讨论】:

    【解决方案2】:

    中删除 @
    CASE WHEN @OrderSeq = 'ASC' THEN Plant.TotalOutput END ASC
    

    CASE WHEN @OrderSeq = 'DESC' THEN Plant.TotalOutput END DESC
    

    问题解决了

    【讨论】:

      猜你喜欢
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2017-10-27
      • 1970-01-01
      • 2011-04-22
      • 2019-06-09
      • 1970-01-01
      相关资源
      最近更新 更多