【发布时间】:2018-06-21 15:39:48
【问题描述】:
我正在尝试执行“插入表”,并看到我们需要明确指定列名。有没有办法在不手动输入的情况下获取这些数据?我正在 BigQuery 上执行此操作。
【问题讨论】:
标签: google-bigquery
我正在尝试执行“插入表”,并看到我们需要明确指定列名。有没有办法在不手动输入的情况下获取这些数据?我正在 BigQuery 上执行此操作。
【问题讨论】:
标签: google-bigquery
这是一个从表中获取列名(不产生成本)并同时构建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)
现在支持在 INSERT 和 MERGE 语句中省略列名。
当省略列名时,目标表中的所有列都按照它们的序号位置升序包含
更多详情here
【讨论】:
REGEXP_EXTRACT_ALL(TO_JSON_STRING(...)) 部分可以。您可以尝试删除部分查询以查看发生了什么。
使用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), ', '),
')');
【讨论】: