我想从公共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问题不重复。
答案 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 * REPLACE
和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
来重构数组,其元素的字段为&#39} ; t包括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
字段。