【问题标题】:dynamic column name selection in MySqlMySql中的动态列名选择
【发布时间】:2012-07-26 19:04:06
【问题描述】:

我今天卡在Mysql中,mysql select语句中需要动态列名。让我解释一下:

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

所以 namescollection 表有三列 name1, name2, name3 我想在我的存储过程中查询这个表 1,2,3 是动态的,并将作为变量传递,但是当我查询时也是在简单的 sql 上:

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

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

对此有何建议,我需要使用正确的函数而不是 concat 虽然我知道在调用 concat 时输出 name1 的权利,但我想将其用作列名。

【问题讨论】:

  • 我不明白。只使用SELECT name1SELECT name2SELECT name3 有什么问题?
  • 为什么不用PHP字符串猫?
  • 我需要在存储过程 @codetiger 和 phMyCoder 中使用它 我想以调用过程名称 (1) //2,3,4 的形式执行它,因此它可能在接下来的几天内更改为 5 或 8,几个月或几年

标签: mysql stored-procedures


【解决方案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 ;

【讨论】:

    【解决方案2】:

    您可以做的是在存储过程中使用准备好的语句,这将允许您执行字符串查询:

    举个简单的例子:

    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测试一下

    【讨论】:

    • 非常感谢赞恩。发现这是解决方案并测试并运行良好。我认为SQL也必须有一些功能。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多