2012-07-23 22 views
1

我有一個SQL查詢,它當前從PHP中的字符串粘貼到一起,我想將它變成一個存儲過程。存儲過程中的SQL變量ORDER BY子句

目前這件事情就像

function db_get ($mode) 
{ 
    $order_by = ''; 
    if ('name'===$mode) 
     $order_by = '`name` DESC'; 
    if ('date'===$mode) 
     $order_by = '`date` DESC'; 
    // ... 

    return db_all_rows ("SELECT foo FROM bar WHERE baz ORDER BY $order_by"); 
} 

我不認爲一個列的名稱可以是一個參數傳遞給一個存儲過程,如此看來,要麼我不得不復制 - 粘貼整個查詢每種類型的訂單 - 它需要,或做一些類似的數字破解這樣的

CREATE PROCEDURE GetStuff (IN use_name INT, IN use_date INT, ...) 
    SELECT foo, (name*use_name + date*use_date + ...) AS order_by_value 
    FROM bar WHERE baz ORDER BY order_by_value 

我不知道哪個更糟。

我更喜歡數字破解的重複,除非它會搞砸優化。

它會搞砸優化器?

或者更好的是,我可以正確地參數化order-by子句嗎?

回答

2

試試這個:

SELECT foo 
FROM bar 
WHERE baz 
ORDER BY 
    case when $order_by='name' then name else null end 
, case when $order_by='date' then date else null end 

的想法是構建所有可能ORDER BY列的列表,並保護每一個有when條件,以便只有其中之一是「積極的」。

+0

*這是*我的目標;我會+1,但我沒票了 – LittleBobbyTables 2012-07-23 19:26:15

+0

@LittleBobbyTables謝謝!就+1而言,它不會計數,因爲我已經在一天中完成了。順便說一句,你有一個非常酷的暱稱和匹配的gravatar – dasblinkenlight 2012-07-23 19:29:49