2012-03-04 53 views
0

我想能夠在遊標聲明的order by子句中使用參數變量。我正在使用MySQL 5.5.21。這是我嘗試使用的代碼。沒有錯誤,但輸出未按照我在參數中提供的列進行排序。有沒有辦法在遊標聲明的ORDER BY子句中有一個變量?

CREATE PROCEDURE getData(IN start_id INT, IN end_id INT, IN col_sort VARCHAR(16), IN max_date DATE) 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE id_num INT; 
    DECLARE rid_num LONG; 
    DECLARE cur1 CURSOR FOR SELECT `ID`,`rid` FROM `clients` WHERE `rid` > 0 AND `date_live` < max_date ORDER BY col_sort LIMIT start_id, end_id; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur1; 
(etc.) 

我很好奇,看看是否可以這樣做。我不想爲每個可能的列定義多個存儲過程。提前致謝。

回答

4

輸出按您提供的輸入(即字符串值)排序,因爲所有行都獲得相同的值,所以該字符串值實際上根本不會排序。

您將需要一個case通過不同的列進行排序:

order by case col_sort 
    when 'col1' then col1 
    when 'col2' then col2 
    when 'col3' then col3 
end 

當然,這需要所有列是相同的數據類型。如果您有不同的數據類型,那麼每個數據類型需要一個case

另一種替代方法是通過連接字符串來創建SQL,然後執行該操作。

+0

酷!我沒有想到使用CASE。 – 2012-03-04 03:13:57

相關問題