BigQuery select *除了两列

时间:2016-12-07 15:53:47

标签: sql google-bigquery

我想从公共BigQuery github_repos数据集中选择所有内容,但两条记录除外:author.name AND difference.old_mode。根据我提出的类似问题,我想我想运行类似于

的查询
#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT author.* EXCEPT (name)) AS author), 
REPLACE ((SELECT AS STRUCT difference.* EXCEPT (old_mode)) AS difference)
FROM `bigquery-public-data.github_repos.commits`
LIMIT 1000;

如果我运行作者排除,则效果很好:

#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT author.* EXCEPT (name)) AS author)
FROM `bigquery-public-data.github_repos.commits`
LIMIT 1000;

但是,差异排除有一个错误:

#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT difference.* EXCEPT (old_mode)) AS difference)
FROM `bigquery-public-data.github_repos.commits`
LIMIT 1000;

错误:

Dot-star is not supported for type ARRAY<STRUCT<old_mode INT64, new_mode INT64, old_path STRING, ...>> at [2:41]

谢谢。

更新SQL server问题不重复。

1 个答案:

答案 0 :(得分:6)

作为一个独立的示例,请考虑以下问题:

WITH T AS (
  SELECT 10 AS a, ARRAY<STRUCT<x INT64, y STRING, z BOOL>>[
      (1, 'foo', true)] AS arr UNION ALL
  SELECT 11, ARRAY<STRUCT<x INT64, y STRING, z BOOL>>[
      (2, 'bar', false), (3, 'baz', true)]
)
SELECT * FROM T;

它会返回a类型的列INT64和类型为arr的列ARRAY<STRUCT<x INT64, y STRING, z BOOL>>。如果您想要返回arr的修改,其中数组中的结构省略了y,则可以使用SELECT * REPLACESELECT * EXCEPT的组合:

WITH T AS (
  SELECT 10 AS a, ARRAY<STRUCT<x INT64, y STRING, z BOOL>>[
      (1, 'foo', true)] AS arr UNION ALL
  SELECT 11, ARRAY<STRUCT<x INT64, y STRING, z BOOL>>[
      (2, 'bar', false), (3, 'baz', true)]
)
SELECT * REPLACE(ARRAY(SELECT AS STRUCT * EXCEPT (y) FROM UNNEST(arr)) AS arr)
FROM T;

我们的想法是用新的数组替换原始数组,我们使用ARRAY子查询与SELECT AS STRUCT* EXCEPT来重构数组,其元素的字段为&#39} ; t包括y

回到问题中的查询,您可以将相同的想法应用于differenceold_mode

SELECT * REPLACE (
  ARRAY(SELECT AS STRUCT * EXCEPT (old_mode) FROM UNNEST(difference)) AS difference
)
FROM `bigquery-public-data.github_repos.commits`
LIMIT 1000;

查询结果包含difference数组,其结构不包含old_mode字段。