You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将CSV行数据手动映射导入SQL数据库对应列

问题描述

我的数据源是CSV文件,里面的列名和对应数据是以行的形式存储的。请问如何在SQL里手动把这些行数据映射到对应的列?以下是文件和目标表的结构:

CSV文件结构

EmpNoColumnNamesColumnValues
1EmpName'John'
1EmpDOB'08/30/1985'
1EmpDesignation'DBA'

目标表:EmployeeDetails

EmpNoEmpNameEmpDOBEmpDesignation
1John08/30/1985DBA

解决方法

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:25:27