Mysql - 通过引用另一个数据集动态更改列名

Posted

技术标签:

【中文标题】Mysql - 通过引用另一个数据集动态更改列名【英文标题】:Mysql - Dynamically change column names by referencing another dataset 【发布时间】:2018-03-08 04:20:36 【问题描述】:

我有两个 mysql 表,我需要使用另一个表中的行值动态重命名一个表的列。 例如:

表_1:

Advertiser_ID, Ad_Id, Clicks, conv_342, conv_439
----------------------------------------------------------------------
23232         231112   5      10        12
23232         231119   22     34        19

表_2:

conversion_id, conversion_name
-------------------------------
conv_342       Conversion_A
conv_439       Conversion_B

我需要将转换 ID(表 1 中的列标题和表 2 中的行值)映射到转换名称,即表 2 值。

结果应如下所示:

Advertiser_ID, Ad_Id, Clicks, Conversion_A, Conversion_B
----------------------------------------------------------------------
23232         231112   5      10        12
23232         231119   22     34        19

转换 id 和名称的列表很长,并且可以动态更改,因此无法硬编码此数据集。数据集一开始也很大。我已经到处寻找解决方案,但其他类似的问题都没有给我答案。

这是直接在 MySQL 引擎上运行的 MySQL,因此不允许使用任何编程语言(php、Python、R 等)。

我尝试了什么

我可以使用以下代码确定 Table_1 列标题是否与 Table_2 中的一行匹配:

SELECT COLUMN_NAME as 'fb_columns'
  FROM information_schema.columns 
 Where table_name='table1'
   AND COLUMN_NAME 
    IN (
         SELECT conversion_id 
           From table2
       )

但我不知道如何使用转换名称重命名列。任何帮助或线索将不胜感激!

编辑:值得注意的是,如果您知道使用 Amazon Redshift 执行此操作的方法,我有资源将其从 MySQL 切换到 Redshift。谢谢!

【问题讨论】:

您将需要运行一个 alter table 语句 - 我不确定 mysql 但在 Oracle 中,您可以使用类似 execute immediate 并在引用 a 的脚本中执行影响 DDL / DML 的语句游标提供的变量 - 但这是一种编程语言,所以... ... ... @Jeff 我可以运行一个变更表,但是我不相信 MySQL 允许你执行立即数... 一个选项可能是使用13.6.6 Cursors 和13.5 Prepared SQL Statement Syntax 的组合。 【参考方案1】:

我最终使用 MySQL 解决了这个问题。这是解决方案。

第 1 步:

DROP PROCEDURE IF EXISTS renameCols; 

第 2 步:

您需要两个表:original_cols,其中应该包含不需要重命名的所有列的列表。 (此查询可能类似于 select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = original_table_name。有关详细信息,请查看this link。

然后 joined_mapping 应该有需要重新命名的列,以及新的列名。例如,在最初的问题中,这将是标题下的代码片段我尝试了什么。 (确保 joined_mapping 没有 NULL。)

那么,真正精彩的部分来了:

此过程使用GROUP_CONCAT() 循环遍历所有cols(需要重命名的列)并使用joined_mapping 中的Name 列重命名它们。然后它还包括所有original_cols(不应重命名的列)。

CREATE PROCEDURE renameCols ()
BEGIN

DROP TABLE IF EXISTS new_table;
SET session group_concat_max_len = 18446744073709551615;
SET @originals = NULL;
SET @cols = NULL;
START TRANSACTION;

SELECT GROUP_CONCAT(DISTINCT CONCAT('`',col,'`')) INTO @originals FROM original_cols;

SELECT
    GROUP_CONCAT(DISTINCT CONCAT ('`',original_column_name,'` as "Conversion: ',conversion_name,'"')) INTO @cols
FROM joined_mapping;

SET @sql = CONCAT("CREATE TABLE new_table AS select ", @originals, " 
                   , ", @cols ," from fb_direct");

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END

第 3 步:

CALL renameCols()

第 4 步:

SELECT * FROM new_table

【讨论】:

以上是关于Mysql - 通过引用另一个数据集动态更改列名的主要内容,如果未能解决你的问题,请参考以下文章

在R中更改数据集的列名[重复]

更改列名的动态过程

delphi 如何通过Tdataset数据集 获取数据库列名以及列数?

mysql视图,存储过程,函数,事务,触发器,以及动态执行sql

mysql选择动态行值作为列名,另一列作为值

MYSQL