2011-08-25 45 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

不知道那一個,感謝啓發。 –