混合类型的mysql存储过程动态排序

标签 mysql sql stored-procedures

我正在创建一个存储过程,我正在向其中动态传递“订单”,如下所示:

CREATE PROCEDURE `getStuff`(IN orderSQL VARCHAR(100))
BEGIN
    SELECT id, name, createdate
    FROM mytable
    ORDER BY
        CASE WHEN orderSQL='id_desc' THEN CONCAT(id, '') END DESC,
        CASE WHEN orderSQL='id_asc' THEN CONCAT(id, '') END ASC,
        CASE WHEN orderSQL='name_desc' THEN name END DESC,
        CASE WHEN orderSQL='name_asc' THEN name END ASC,
        CASE WHEN orderSQL='date_desc' THEN CONCAT(createdate, '') END DESC,
        CASE WHEN orderSQL='date_asc' THEN CONCAT(createdate, '') END ASC
END

如您所见,我正在使用 CONCAT 将所有非 VARCHAR 字段转换为 VARCHAR,因为混合可能的订单类型不起作用,如此处所述 https://web.archive.org/web/20211029044050/https://www.4guysfromrolla.com/webtech/010704-1.shtml .

我的问题是现在按名称排序有效,但非字符串顺序返回为 1、10、11、2、3、4、5、6、7、8、9。等等

有没有办法使用混合数据类型动态排序,并且仍然以正确的顺序返回整数、日期时间等。

最佳答案

解决方案是像这样完全动态地创建SQL语句

DELIMITER $$

CREATE PROCEDURE GetStuff (IN orderSQL varchar(100) ) 
BEGIN

  DECLARE SQLStatement varchar(255);

  -- Enter the dynamic SQL statement into the
  -- variable @SQLStatement
  SET SQLStatement = CONCAT('SELECT id, name, createdate ',
                             'FROM mytable ',
                             'ORDER BY ',orderSQL);

  PREPARE stmt FROM SQLStatement;
  EXECUTE stmt;
END $$

DELIMITER ;

查看此处了解更多信息:http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html

关于混合类型的mysql存储过程动态排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7185740/

相关文章:

mysql - rubyonrails mysql2

基于 PHP session 的购物车问题

mysql - 为什么 ORDER BY 不使用索引?

c# - sql连接字符串问题

sql - postgresql 中的年龄限制

asp.net - 用于将非英文字符存储到 SQL 数据库的 HTML/ASPX 文本框

sql-server - TSQL - 在动态表中使用 Case 语句(行数未知)

java - SimpleJDBCCall 类参数传递

sql-server - 如何指定要在 SSRS 报告向导中使用的存储过程?

php - 修改MYSQL字段中的一个值有多个值(复杂)