如何将CSV行数据手动映射导入SQL数据库对应列
问题描述
我的数据源是CSV文件,里面的列名和对应数据是以行的形式存储的。请问如何在SQL里手动把这些行数据映射到对应的列?以下是文件和目标表的结构:
CSV文件结构
| EmpNo | ColumnNames | ColumnValues |
|---|---|---|
| 1 | EmpName | 'John' |
| 1 | EmpDOB | '08/30/1985' |
| 1 | EmpDesignation | 'DBA' |
目标表:EmployeeDetails
| EmpNo | EmpName | EmpDOB | EmpDesignation |
|---|---|---|---|
| 1 | John | 08/30/1985 | DBA |
解决方法
方法1:条件聚合(通用所有SQL数据库)
这种写法兼容性拉满,不管是MySQL、PostgreSQL还是SQL Server都能用,核心逻辑是按EmpNo分组,用CASE语句匹配列名提取对应值:
SELECT EmpNo, MAX(CASE WHEN ColumnNames = 'EmpName' THEN REPLACE(ColumnValues, '''', '') END) AS EmpName, MAX(CASE WHEN ColumnNames = 'EmpDOB' THEN REPLACE(ColumnValues, '''', '') END) AS EmpDOB, MAX(CASE WHEN ColumnNames = 'EmpDesignation' THEN REPLACE(ColumnValues, '''', '') END) AS EmpDesignation FROM 你的CSV导入临时表名 -- 先把CSV数据导入到临时表/视图 GROUP BY EmpNo;
注:REPLACE(ColumnValues, '''', '')用来去除CSV值里的单引号,不同数据库的字符串处理语法可能略有差异,比如SQL Server可以用TRIM(ColumnValues, '''')替代。
方法2:使用PIVOT语法(适用于SQL Server/Oracle等支持的数据库)
如果用的是支持PIVOT的数据库,能写出更简洁的代码:
SELECT EmpNo, EmpName, EmpDOB, EmpDesignation FROM ( SELECT EmpNo, ColumnNames, REPLACE(ColumnValues, '''', '') AS ColumnValues FROM 你的CSV导入临时表名 ) AS SourceTable PIVOT ( MAX(ColumnValues) FOR ColumnNames IN (EmpName, EmpDOB, EmpDesignation) ) AS PivotTable;
方法3:直接插入到目标表
如果要把转换后的数据直接写入EmployeeDetails表,基于条件聚合写INSERT语句即可:
INSERT INTO EmployeeDetails (EmpNo, EmpName, EmpDOB, EmpDesignation) SELECT EmpNo, MAX(CASE WHEN ColumnNames = 'EmpName' THEN REPLACE(ColumnValues, '''', '') END) AS EmpName, MAX(CASE WHEN ColumnNames = 'EmpDOB' THEN REPLACE(ColumnValues, '''', '') END) AS EmpDOB, MAX(CASE WHEN ColumnNames = 'EmpDesignation' THEN REPLACE(ColumnValues, '''', '') END) AS EmpDesignation FROM 你的CSV导入临时表名 GROUP BY EmpNo;
内容的提问来源于stack exchange,提问作者learner123
相关产品推荐
相关产品推荐

