postgresql - 根据条件聚合查询 Postgres jsonb 数组

标签 postgresql jsonb

我有一个 postgres 表 (documents),它有一个名为 details 的 jsonb 列,它包含一个如下所示的 jsonb:

{
  "identifier": "lead_id",
  "callback_url": "http://localhost:3000/supply/internal/api/v3/attempts/9a967788-ad44-499e-93e8-3ce6544f3786",
  "document_ids": [
    "0246ef40-db40-4c07-898c-7c09ad50d3ff",
    null,
    "c155d537-2faf-4397-90ba-741651fdee9d",
    "f926ffc5-6184-44ad-ac16-3da7c0bc3186",
    "68f91648-9297-4f34-b320-d00cec04f52c",
    "2159baf8-55a9-40f9-a998-3b237f370b3a"
  ],
  "identifier_value": "9a967788-ad44-499e-93e8-3ce6544f3786"
}

document_ids 是一个 jsonb 数组,其中包含文档 ID 列表,其中一些可能为空。我想运行一个聚合查询,以便在输出中得到一个不同的 identifier_value 列表和为 null 的 document_ids 的数量。

例如,对于上面的json,输出应该是: 9a967788-ad44-499e-93e8-3ce6544f3786, 1

想不出这样的查询会是什么样子。感谢您的帮助!

最佳答案

您可以使用函数 jsonb_array_elements():

select details->'identifier_value', sum((value = 'null'::jsonb)::int)
from documents
cross join jsonb_array_elements(details->'document_ids')
group by 1
order by 2 desc

Db<>fiddle.

Postgres 12 中使用 jsonpath 类型:

select details->'identifier_value', count(d)
from documents
left join jsonb_path_query(details, '$.document_ids[*] ? (@ == null)') as d on true
group by 1
order by 2 desc

Db<>fiddle.

阅读文档:

关于postgresql - 根据条件聚合查询 Postgres jsonb 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58320493/

相关文章:

java - Migration play 2.4后,使用postgresdb已有序列生成Play-2.4 Entity的id

ruby-on-rails - Rails ransack gem 以键值对作为参数搜索 jsonb 列

sql - 无法使用 MS Access 前端删除记录

sql - 获取 postgresql 中有序集合的最后一个元素

ruby-on-rails - 在 ActiveRecord 中查询包含来自多个数组的一个或多个 id 的对象

postgresql - 如何将数组的jsonb数组转换为记录

json - 将 JSON 迁移到 HSTORE

postgresql - OpenErp 服务器错误

postgresql - 如何使用 PostgreSQL JSONB_SET() 创建新的深层对象元素

postgresql - sequelize postgres 将 fn 'date' 与 jsonb 值结合起来