使用Postgres计算jsonb数组中的对象

问题描述 投票:0回答:1

假设表中的每个jsonb值都具有以下结构:

{
  "level1": [
    {
      "level2": [
        {
          "key": key,
          "value": value,
          "messages": [

          ]
        },
        {
          "key": key,
          "value": value,
          "messages": [

          ]
        },
        {
          "key": key,
          "value": value,
          "messages": [

          ]
        }
      ]
    }
  ]
}

关键level1的名称是动态的,所以可以是任何东西(这就是为什么我使用jsonb_object_keys)。我需要检查level2.messages中的任何对象是否为每个日期为空。也就是说:如果日期中的所有level2.messages都为空,则返回false。否则(至少有一个带有消息的对象具有非空数组),返回true。

我以为我可以在子查询中使用json函数,但在子查询中不知道它们。我有这样的事情:

SELECT t2.date, 
(SELECT 1 FROM fields WHERE jsonb_array_length(fields ->> 'messages') = 1 LIMIT 1) AS hasMessages
FROM table1 t1
INNER JOIN table2 t2 ON t2.id = t1.id,
jsonb_object_keys(t1.result) AS rootNode,
jsonb_array_elements(t1.result -> rootNode) AS level2,
jsonb_array_elements(level2 -> 'level2') AS fields
GROUP BY t2.date
postgresql jsonb
1个回答
0
投票

基于问题中的零碎信息,这将起作用:

SELECT date
     , count(*) AS message_count
     , count(*) FILTER (WHERE l2_val->'messages' = '[]') AS empty_message_count
FROM   table1 t1
     , jsonb_object_keys(result) AS key1
     , jsonb_array_elements(result->key1->0->'level2') AS l2_val
GROUP  BY 1
-- HAVING ?

这是假设:

  • 始终只有JSON对象外层的一个键名。
  • level1中始终只有一个数组元素。
  • 嵌套数组的关键名称是level2'。

我想你想要识别那些有消息的人,但都是空的......

© www.soinside.com 2019 - 2024. All rights reserved.