我导入了一个名为book1的表,其列名为:id,2018m01,2018m02,2018m03
我现在需要导入第二个名为book2的表,其列名为:id,2018m05,2018m06,2018m07
两个表中的列名之间有一些相似之处,即前缀year 2018。
如果可能的话,我不希望继续为每个表的每个列名编写这部分代码,如下所示
CREATE TABLE book1 (
ID VARCHARACTER(10),
2018M01 decimal(4,2),
2018M02 decimal(4,2),
2018M03 decimal(4,2)
);
实际上,实际的表有几个列。
下面编写的代码考虑了第一个表和一些动态节代码,但是我需要一些关于第二个导入表的帮助。
DROP TABLE IF EXISTS book1;
CREATE TABLE book1 (
ID VARCHARACTER(10),
2018M01 decimal(4,2),
2018M02 decimal(4,2),
2018M03 decimal(4,2)
);
LOAD DATA LOCAL INFILE '/Users/blytonpereira/Desktop/Book1.csv' REPLACE INTO TABLE book1
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;
SELECT
GROUP_CONCAT(
CONCAT(
'SELECT id, ''', COLUMN_NAME, ''' as month, ', COLUMN_NAME, ' as QTY FROM t1 ') SEPARATOR ' UNION ALL ')
FROM
`INFORMATION_SCHEMA`.`COLUMNS`
WHERE
`COLUMN_NAME` LIKE '2018%'
INTO @sql;
SET @query = CONCAT('select id, month, QTY from (' , @sql , ') x order by id;');
SELECT @query;
PREPARE stmt FROM @query;
EXECUTE stmt;
我希望避免为每个导入显式定义列名。我正在进行的每个导入都是相似的,但略有不同,即列名每次都在更新,例如在第一个表中是2018m01..2018m02…2018m03….在第二个表中是2018m02..2018m03..2018m04。我需要一些帮助来编写代码的第二部分,在这里导入第二个文件
1条答案
按热度按时间1mrurvl11#
这只是一个建议,显然没有测试和一些固有的假设。
看起来可以将每个文件加载到同一个表中,从而避免使用动态列名。i、 你忽略了最上面的一行,我认为它有列名
所以“分段”可以这样定义:
你可以用参数设置一个固定的查询,就像这样
在加载文件的每个周期结束时,可以截断或删除临时表(取决于首选方法),以便为下次运行做好准备。
正如一个观察,列名也是函数名或保留字,使用起来很痛苦。我个人不会使用列名
month
. 类似地,我更愿意使用像2018-01-01这样的真实日期,而不是像2018m01这样的字符串,但使用这些字符串可能还有其他原因我不知道。