我想从公共(public) 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 的重复项问题。
最佳答案
作为一个独立的示例,请考虑以下查询:
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
使用字段不包含 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
的数组字段。
关于sql - BigQuery 选择 * 两列除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41021823/