如何从具有字典列表的表中查询,仅针对某些键 (BigQuery) SQL

Posted

技术标签:

【中文标题】如何从具有字典列表的表中查询,仅针对某些键 (BigQuery) SQL【英文标题】:How to query from a table with a list of dictionaries, only for certain keys (BigQuery) SQL 【发布时间】:2021-10-21 00:09:29 【问题描述】:

我在 Google BigQuery 上有一个表,其中 每一行 都有一个名为“customized_field”的字段,该字段是一个包含 25 个字典列表的字典(每个字典只有 1 个键/值对)。每行都有一个相同的字典(具有相同的“id”名称),只是“值”中的数量不同。字典是这样的:

[
  
    "customized_field": [
      
        "data": 
          "id": "Bob",
          "value": 3
        
      ,
      
        "data": 
          "id": "Jim",
          "value": 4
        
      ,
      
        "data": 
          "id": "Mary",
          "value": 2
        
      ,
      etc etc... (22 more)
   
]

我想创建一个创建两列(特别是“Bob”和“Mary”)的表,其中两列中的每一列的值都是字典中的“值”。所以表格看起来像这样:

Bob Mary
3 2
4 (say this is the value in the next row) 5 (say this is the value in the next row)

我的 SQL 脚本如下所示:

SELECT
CASE when h.data.id = "Bob" then h.value.value end Bob,
CASE when h.data.id = "Mary" then h.value.value end Mary
FROM `my_database`, UNNEST(`my_database `. customized_field) AS h

但是,这给了我一个看起来我想要的表格,但它创建的行数是我需要的 25 倍(我相信它会重复,因为有 25 个键值对,当我执行“unnest”时,它基本上会创建一吨更多的行)。 我如何获得它以使其不会重复?

我的查询给出了这样的表格:

Bob Mary
3 2
4 5
3 2
4 5
3 2
4 5

等等等等。

【问题讨论】:

【参考方案1】:

考虑以下方法

select * except(key) from (
  select h.data.id, h.data.value, to_json_string(t) key
  from `my_database` t, unnest(t.customized_field) AS h
)
pivot (max(value) for id in ('Bob', 'Mary'))     

输出如下所示

【讨论】:

以上是关于如何从具有字典列表的表中查询,仅针对某些键 (BigQuery) SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何从 EF 中的表中仅选择某些字段

where 从具有列外键的表中查询

实体框架:如何从具有复合键的表中返回一行?

MySQL 仅更新表中的某些字段

过滤字典以仅包含某些键?

过滤字典以仅包含某些键?