小编典典

BigQuery选择*,但嵌套列除外

sql

我想做的事情应该很简单:给定一个BigQuery模式,我要选择除少数几个表外的所有表(包括嵌套表)。棘手的是,BigQuery具有嵌套结构,而我要排除的少数嵌套在其他记录中。

我在BigQuery文档中找到了SELECT * except子句,这似乎很有希望。问题在于它似乎不支持嵌套结构排除。

例如,使用公共github_nested数据集,我们可以编写如下查询

#standardSQL
SELECT * except (payload) FROM `bigquery-public-data.samples.github_nested` LIMIT 1000

通过从结果中删除有效负载记录,可以成功完成我们的预期。现在让我们想象一下,我们只想删除payload.comment,从而在响应中保留其余的payload记录内容。我试过了

#standardSQL
SELECT * except (payload.comment) FROM `bigquery-public-data.samples.github_nested` LIMIT 1000

但是,这失败了。

有人知道实现此目标的方法吗?

谢谢!


阅读 239

收藏
2021-03-17

共1个答案

小编典典

解决问题的方法是,您仍然需要payload结果中的列,但是您希望它具有不同的结构,即exclude
comment。在这种情况下,您可以使用SELECT * REPLACE进行修改。例如,

#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT payload.* EXCEPT (comment)) AS payload)
FROM `bigquery-public-data.samples.github_nested`
LIMIT 1000;
2021-03-17