【问题标题】:Add column with name of variable value添加具有变量值名称的列
【发布时间】:2021-06-28 08:25:08
【问题描述】:

在程序内部,我想创建一个临时表“report”,其中包含另一个表“descriptions”行内容的列名,但我收到错误,因为我的查询不是使用变量“tmp_description”值,而是使用它的名称来创建一个新的列。如何使用变量值作为新列的名称?

DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE tmp_description varchar(30);

...

CREATE TEMPORARY TABLE descriptions (description varchar(30));

insert into descriptions
        select distinct description from pure;
    
SELECT COUNT(*) INTO n FROM descriptions;
            SET i=0;
            WHILE i<n DO 
                SELECT * INTO tmp_description FROM (SELECT * FROM descriptions LIMIT i,1) t1;
                ALTER TABLE report
                ADD COLUMN 
                    tmp_description FLOAT(2) DEFAULT 0.0;          <-- I get error here
                SET i = i + 1;
            END WHILE;

【问题讨论】:

  • 你必须在PREPARE语句中使用动态SQL。
  • 你读过这个吗? References
  • @MuhKandaWibawaPutra,不,谢谢
  • @MuhKandaWibawaPutra 另一个 DBMS,无济于事(除了需要动态 SQL 的事实)。
  • @Akina,正如我在问题中所说,是的。

标签: mysql sql procedure temp-tables alter


【解决方案1】:

我认为在while 循环中执行此操作没有任何价值。无论如何,您的循环机制都已关闭,因为您使用的是 LIMIT 而没有 ORDER BY - 这意味着每次迭代返回的行是任意的。

为什么不只构造一个语句?第一次运行:

select group_concat('add column ', description, ' numeric(2)' separator ', ') as columns
from t;

请注意,float(2) 作为数据类型对我来说并没有什么意义。我怀疑你真的想要一个numeric/decimal 类型。

然后获取结果。在它们前面加上 alter table report 并运行代码。

您可以使用动态 SQL 来执行此操作,但我认为这样做没有任何好处。

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2016-06-24
    • 2022-07-22
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多