【问题标题】:BigQuery select * except two columnsBigQuery 选择 * 除了两列
【发布时间】:2017-04-22 15:41:45
【问题描述】:

我想从公共 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 问题的重复项。

【问题讨论】:

标签: sql google-bigquery


【解决方案1】:

作为一个独立的例子,考虑这个查询:

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;

它返回INT64 类型的列aARRAY&lt;STRUCT&lt;x INT64, y STRING, z BOOL&gt;&gt; 类型的列arr。如果您想返回对arr 的修改,其中数组内的结构省略了y,您可以使用SELECT * REPLACESELECT * 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;

我们的想法是用一个新数组替换原始数组,我们使用SELECT AS STRUCT* EXCEPTARRAY 子查询来重构具有字段不包含y 的结构元素的数组。

回到问题中的查询,您可以将相同的想法应用于differenceold_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 字段。

【讨论】:

  • 你太棒了;太感谢了。对于将来引用此内容的任何人,要完成我的问题的示例,所需要做的就是将我工作的另一个替换查询行添加到 Elliott 上面的替换函数中。这会成功删除这两个字段。
  • @Elliott 如果我的表结构如下所示。我应该如何更改我的查询。 WITH T AS ( SELECT 10 AS a, STRUCT (1, 'foo', true) AS arr UNION ALL SELECT 11, STRUCT (2, '酒吧',假))
  • 请提交一个新问题。
猜你喜欢
  • 2017-04-22
  • 1970-01-01
  • 2017-08-22
  • 2010-09-29
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多