作为一个独立的示例,请考虑以下查询:
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;
它返回
atype
INT64的列
arr和type的列
ARRAY<STRUCT<x INT64, y STRING, zBOOL>>。如果要返回
arr对数组内部结构省略位置的修改,则
y可以使用
SELECt * REPLACEand的组合
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并使用
*EXCEPT其字段不包括的struct元素重构该数组
y。
回到问题中的查询,您可以将相同的想法应用于
difference和
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字段。



