我有一个 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
在 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
阅读文档:
关于postgresql - 根据条件聚合查询 Postgres jsonb 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58320493/