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 - 通过引用另一个数据集动态更改列名的主要内容,如果未能解决你的问题,请参考以下文章
delphi 如何通过Tdataset数据集 获取数据库列名以及列数?