2011-08-25 43 views
4

我创建一个存储过程,我传递到其中“秩序”动态,像这样:MySQL的存储过程的动态顺序与混合型

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 

正如你可以看见我将所有的非VARCHAR字段VARCHAR使用CONCAT,因为混合可能的订单类型,这里http://www.4guysfromrolla.com/webtech/010704-1.shtml解释不起作用。

我的问题是,现在按名称排序工作,但无串订单回来为1,10,11,2,3,4,5,6,7,8,9。等

是否有使用混合数据类型动态排序,并仍然以正确的顺序返回整型,日期时间等

回答

5

的解决方案是创建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 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; 
+0

情况下,使用只在表达,不是吗?所以这应该是一系列“IF ... ELSE IF ...”,我想。 –

+0

这些是不同的CASE语句。我用这一个 - http://dev.mysql.com/doc/refman/5.1/en/case-statement.html。 – Devart

+0

不知道那一个,感谢启发。 –