【问题标题】:Count objects in jsonb array with Postgres使用 Postgres 计算 jsonb 数组中的对象
【发布时间】:2019-07-13 03:30:59
【问题描述】:

假设表中的每个 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。否则(至少有一个带有 message 的对象有一个非空数组),返回 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

【问题讨论】:

  • 始终从您的 Postgres 版本开始。除其他外,可用工具的库取决于它。以及table1table2 的表定义 - 以及对这两个表的解释。或从您的问题中删除 table2

标签: postgresql jsonb


【解决方案1】:

根据问题中的零碎信息,这可行:

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'。

我猜你想找出那些确实有消息,但都是空的......

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多