【问题标题】:mysql stored procedure dynamic order by with mixed typesmysql存储过程动态排序,混合类型
【发布时间】:2011-11-03 09:14:42
【问题描述】:

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

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,因为混合可能的订单类型不起作用,如 http://www.4guysfromrolla.com/webtech/010704-1.shtml 所述。

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

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

【问题讨论】:

    标签: mysql sql stored-procedures


    【解决方案1】:

    解决办法是像这样动态创建完整的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

    【讨论】:

      【解决方案2】:

      您应该使用prepared statements 来构建和执行自定义查询,或者您应该为所有查询编写大 CASE 条件,即 -

        CASE orderSQL
          WHEN 'id_desc' THEN
            SELECT id, name, createdate FROM mytable ORDER BY id;
          WHEN 'id_desc' THEN
            SELECT id, name, createdate FROM mytable ORDER BY id_desc;
          ...
          ...
          ...
        END CASE;
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 2015-12-12
      • 2010-09-14
      • 2015-09-30
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      相关资源
      最近更新 更多