繁体   English   中英

如何在不重新指定 BigQuery 中的所有其他字段的情况下添加/删除结构字段

[英]How to add/remove struct fields without re-specifying all other fields in BigQuery

我有以下数据形状和有效的 BigQuery 查询:

WITH
Person AS (
  SELECT 'Alice' AS name, 10 AS address_id,
         [STRUCT("Rexi" AS name, 5 AS species_id), STRUCT("Luna", 6)] AS pets UNION ALL
  SELECT 'Bob', 11, [STRUCT("Ralfie", 5)] UNION ALL
  SELECT 'Chandra', 10, []),
Address AS (
  SELECT 10 AS id, 'Jump Street' AS street, 'UK' AS country UNION ALL
  SELECT 11, 'Paper Street', 'US'
  ),
Species AS (
  SELECT 5 AS id, 'Dog' as name, 11 as lifespan UNION ALL
  SELECT 6, 'Cat', 15
)
SELECT p.* EXCEPT (address_id),
  (SELECT AS STRUCT a.* EXCEPT(id)) AS address
FROM Person p
  JOIN Address a ON p.address_id = a.id

正如我们所看到的, Person有一个pets记录数组,以及一个带有address的可连接 id。 每个宠物也有一个可连接的 id 与species

就像我使用SELECT p.* EXCEPT (address_id)从结果中删除address_id并将地址作为每个人的结构加入一样,我希望我可以删除species_id字段并将物种作为每个宠物的结构加入。

即,我希望我有像SELECT p.* EXCEPT (address_id, pets[*].species_id)这样的语法和“加入结构内部”的能力。

我的理想结果将是一个不必重复所有物种字段名称的查询,但结果如下:

[{
  "name": "Alice",
  "pets": [{
    "name": "Rexi",
    "species": {
      "name": "Dog",
      "lifespan": 11,
    }
  }, {
    "name": "Luna",
    "species": {
      "name": "Cat",
      "lifespan": 15,
    }
  }],
  "address": {
    "street": "Jump Street",
    "country": "UK"
  }
},
<...>]

这有可能吗?

作为如何创建带有连接但不指定所有字段的 BigQuery 记录的后续答案? ,考虑以下查询:

SELECT p.* EXCEPT (address_id) REPLACE (
         ARRAY(SELECT AS STRUCT p.* EXCEPT(species_id),
               (SELECT AS STRUCT s.* EXCEPT(id)) AS species
                  FROM UNNEST(pets) p JOIN Species s ON p.species_id = s.id
              )
         AS pets 
       ),
       (SELECT AS STRUCT a.* EXCEPT(id)) AS address
  FROM Person p
  JOIN Address a ON p.address_id = a.id;

输出将是:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM