2012-07-28 79 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 ;