【问题标题】:Find column names to insert into BigQuery查找要插入 BigQuery 的列名
【发布时间】:2018-06-21 15:39:48
【问题描述】:

我正在尝试执行“插入表”,并看到我们需要明确指定列名。有没有办法在不手动输入的情况下获取这些数据?我正在 BigQuery 上执行此操作。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    这是一个从表中获取列名(不产生成本)并同时构建INSERT 列表的示例:

    WITH EmptyReference AS (
      SELECT *
      FROM `bigquery-public-data.samples.shakespeare`
      LIMIT 0
    )
    SELECT
      CONCAT(
        'INSERT dataset.tablename (',
        ARRAY_TO_STRING(
          REGEXP_EXTRACT_ALL(
            TO_JSON_STRING((SELECT AS STRUCT t.*)),
            r'"([^"]+)":'),
          ', '),
        ')')
    FROM (
      SELECT AS VALUE t
      FROM EmptyReference AS t
      UNION ALL SELECT AS VALUE NULL
    ) AS t
    

    这会返回:

    INSERT dataset.tablename (word, word_count, corpus, corpus_date)     
    

    June 2019 Update

    现在支持在 INSERT 和 MERGE 语句中省略列名。

    当省略列名时,目标表中的所有列都按照它们的序号位置升序包含

    更多详情here

    【讨论】:

    • 完美运行!!非常感谢。
    • 这个查询的哪一部分实际上只是获取列名?
    • REGEXP_EXTRACT_ALL(TO_JSON_STRING(...)) 部分可以。您可以尝试删除部分查询以查看发生了什么。
    【解决方案2】:

    使用INFORMATION_SCHEMA,Elliott 的查询可以重写为:

    WITH ColumnNames AS (
      SELECT column_name FROM dataset.INFORMATION_SCHEMA.COLUMNS
      WHERE table_schema = 'tablename'
    )
    SELECT CONCAT(
      'INSERT dataset.tablename (',
      ARRAY_TO_STRING(ARRAY(SELECT column_name FROM ColumnNames), ', '),    
      ')');
    

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 2017-04-17
      • 2018-01-24
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多