BigQuery select*除了两列

Spi*_*key 2 sql google-bigquery

我想从公共BigQuery github_repos数据集中选择一切,除了两个记录:author.name 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;
Run Code Online (Sandbox Code Playgroud)

如果我运行作者排除,它运作良好:

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

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

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

错误:

Dot-star is not supported for type ARRAY<STRUCT<old_mode INT64, new_mode INT64, old_path STRING, ...>> at [2:41]
Run Code Online (Sandbox Code Playgroud)

谢谢.

更新 不是SQL服务器问题的副本.

Ell*_*ard 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;
Run Code Online (Sandbox Code Playgroud)

它返回一个列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;
Run Code Online (Sandbox Code Playgroud)

我们的想法是用一个新数组替换原始数组,我们使用ARRAY子查询,SELECT AS STRUCT并使用* EXCEPT其字段不包含的struct元素重建数组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;
Run Code Online (Sandbox Code Playgroud)

查询结果包含一个difference数组,其结构不包含该old_mode字段.