【问题标题】:MySQL CSV Export with Data and Header带有数据和标题的 MySQL CSV 导出
【发布时间】:2023-03-29 21:45:01
【问题描述】:

我也尝试从带有标头的 MySQL 数据库中导出 CSV。但我收到以下错误-

ERROR 1222 (21000): The used SELECT statements have a different number of columns

MySQL 查询如下-

SELECT * FROM (
  (SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'ORDERS'
    AND TABLE_SCHEMA = 'REMOTE'
    ORDER BY ORDINAL_POSITION)
  UNION ALL
  (SELECT * FROM ORDERS WHERE orderDate>='2018-05-07')) AS TBL
INTO OUTFILE 'C:/xampp/htdocs/WES/DBScript/SS_Orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    通常你必须这样做:

    SELECT *
    FROM (
        select 'A', 'B', 'C'
        union all
        select a, b, c from table
        ) t
    INTO OUTFILE [...]
    

    请注意,您必须确保所有列数据类型都正确匹配,这意味着它们都需要是 varchar 或类似的。

    对于标题,您可以通过以下方式自动化它们:

    SELECT * FROM (
    SELECT MAX(CASE WHEN ORDINAL_POSITION = 1 THEN COLUMN_NAME END),
        MAX(CASE WHEN ORDINAL_POSITION = 2 THEN COLUMN_NAME END),
        MAX(CASE WHEN ORDINAL_POSITION = 3 THEN COLUMN_NAME END),
        MAX(CASE WHEN ORDINAL_POSITION = 4 THEN COLUMN_NAME END),
        MAX(CASE WHEN ORDINAL_POSITION = 5 THEN COLUMN_NAME END),
        MAX(CASE WHEN ORDINAL_POSITION = 6 THEN COLUMN_NAME END),
        [...]
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'ORDERS'
        AND TABLE_SCHEMA = 'REMOTE'
    UNION ALL
    SELECT [...]
    ) t
    INTO OUTFILE [...]
    

    但您仍然需要知道列数。如果您想动态地执行此操作,则本质上将需要动态 SQL。

    It may be easier to just write a Python script to do it.

    【讨论】:

    • 这个表有72列。你能不能给我一些简洁的东西?
    • Python 很棒,但 MySQL 或 MariaDB 也应该没问题。
    • @observo 不,我无法为您提供更简洁的内容。 INTO OUTFILE 不支持输出标头。这是 MySQL 和 MariaDB 的限制,如果你想使用它,你必须解决这个限制。动态地将行转换为列——这就是你对information_schema.columns 所做的——很难,因为它破坏了数据库规范化。如果你使用这种方法会很难看,因为 SQL 从字面上看并不意味着这样做。 UNION ALL 方法是一种 有点 有效的 hack,但它很丑陋(并且在技术上是不确定的,如此处所写)。
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 2020-07-01
    • 2019-07-25
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多