2011-12-18 41 views
7

目標是根據輸入變量在Mysql存儲過程中更改查詢字符串。Mysql根據邏輯在存儲過程中動態構建查詢字符串

像這樣:

CREATE DEFINER=`root`@`localhost` PROCEDURE `func`(type VARCHAR(15)) 
BEGIN 
    SET @type = type; 

    -- Check for the sort parameter 
    if @type="asc" THEN 
     SET @sort = " order by name asc"; 
    elseif @type="desc" THEN 
     SET @sort = " order by name desc"; 
    else 
     SET @sort =""; 
    end if; 

SELECT id, name from table @sort; 

END  
+1

的解決方案是使用執行和CONCAT: CREATE DEFINER ='root' @ 'localhost' PROCEDURE'test'(input VARCHAR(15)) BEGIN SET @input = input; if @ input =「asc」then SET @sort =「order by ActivityLogKey asc」; elseif @input =「desc」then SET @sort =「order by ActivityLogKey desc」;其他 SET @sort =「」; end if; SET @query = CONCAT('select * from activitylog',@ sort,'limit 0,5'); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; END – 2011-12-18 03:57:29

+0

如果這是解決方案,爲什麼你沒有添加它作爲答案,並接受它或編輯你的問題。 – 2011-12-18 11:51:13

+0

沒有100的聲望,我必須等待8個小時才能回答我自己的問題 – 2011-12-18 17:10:40

回答

13

的解決方案是使用執行和CONCAT:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(input VARCHAR(15)) 
BEGIN 
SET @input = input; 

if @input="asc" then 
    SET @sort = " order by ActivityLogKey asc"; 
elseif @input = "desc" then 
    SET @sort = " order by ActivityLogKey desc"; 
else 
    SET @sort =""; 
end if; 

SET @query = CONCAT('select * from activitylog ',@sort,' limit 0, 5'); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END 
+0

我發現的有用性是爲了能夠有條件地將連接,字段或任何其他SQL代碼作爲存儲過程的一部分而不是PHP。 在存儲的proc級別實現這一點似乎更清晰。 – 2011-12-18 17:12:42