作为一个独立的示例,请考虑以下查询:
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 * REPLACE
and SELECT * 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
and * EXCEPT
使用字段不包含的结构元素重建数组y
.
回到问题中的查询,您可以将相同的想法应用于difference
and old_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
field.