2012-07-28 119 views
4

我今天被困在Mysql中,動態列名需要在mysql select語句中。讓我來解釋:MySql中的動態列名選擇

sql> select name1 from namescollection. 
sql> select name2 from namescollection. 
sql> select name3 from namescollection. 

所以namescollection表有三列有1,名稱2,名稱3 我想查詢這個表我的存儲過程是1,2,3動態,並會作爲一個變量傳遞,但在簡單的SQL太當我查詢:

SELECT concat('name','1') FROM `namescollection` 

name1 ----- name1 rather fetching name1 field's value.

能有這方面的建議,正確的函數我需要使用,而CONCAT雖然我知道它的正確輸出NAME1當我打電話concat,但我想用我t作爲列名。

+0

我不明白。剛剛使用「SELECT name1」,「SELECT name2」和「SELECT name3」有什麼問題? – 2012-07-28 07:03:20

+0

爲什麼你不使用PHP字符串貓? – codetiger 2012-07-28 07:04:04

+0

我需要使用它在存儲過程@codetiger和phMyCoder 我想執行它作爲調用過程名稱(1) // 2,3,4像這樣它可能會更改爲5或8在未來幾天,幾個月或幾年 – Luckyy 2012-07-28 07:07:05

回答

8

你可以做的是使用存儲過程中的事先準備好的聲明,這將使你執行一個查詢字符串:

舉個簡單的例子:有

DELIMITER // 
CREATE PROCEDURE selname (IN col VARCHAR(20)) 
BEGIN 
    SET @sql = CONCAT('SELECT ', col, ' FROM tbl'); 
    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END// 
DELIMITER ; 

測試一下此SQLFiddle Demo

+0

非常感謝Zane。發現這是解決方案並經過測試,運行良好。我認爲SQL也必須有一些功能。謝謝:) – Luckyy 2012-07-28 07:39:28

+0

SQLFiddle?你懂得越多... – 2014-02-19 19:43:23

-1

存儲過程中的動態列名稱更新語句

DELIMITER // 
CREATE DEFINER=`root`@`localhost` PROCEDURE `selname`() 
BEGIN 
    declare cl int ; 
    declare clvalue int ; 

    set cl=1; 
    SET clvalue=1; 
    while cl < 4 DO 
     SET clvalue=clvalue*cl; 
     SET @sql = CONCAT('update test set col',cl, '=',clvalue,' where id=1'); 
     PREPARE stmt FROM @sql; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
     set cl=cl+1; 
    end while; 

END // 
DELIMITER ;