sql - BigQuery 选择 * 两列除外

标签 sql google-bigquery

我想从公共(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 的结构体元素重建数组.

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

关于sql - BigQuery 选择 * 两列除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41021823/

相关文章:

google-bigquery - 在 SQL 中,计算多个重叠对话的开始时间戳和结束时间戳之间的时间差

c# - 如果没有要返回的结果集,查询似乎真的很慢

mysql - 项目和类别 (1 :N) How to get number of total and total active items per category in single SQL query?

sql - SQL Server 中 2 个表的公共(public)记录

sql - BigQuery 检查表是否存在

json - 尝试从bigquery上的一到多列中提取json值

SQL 查询 - MySQL 中按时间跨度分组

sql - 如何使用 group by 函数只取最后两行 postgres

google-bigquery - 我们可以使用 Python 创建数据洞察报告吗?

arrays - BigQuery - UNNEST 中引用的值必须是数组。 UNNEST 在 [5 :18] 处包含 STRUCT ... 类型的表达式