Совокупный запрос к массиву jsonb Postgres на основе условия - PullRequest
1 голос
/ 10 октября 2019

У меня есть таблица postgres (documents), в которой есть столбец jsonb с именем details, который содержит 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, который содержитсписок идентификаторов документов, некоторые из которых могут быть нулевыми. Я хочу выполнить запрос агрегации, чтобы при выводе я получил список отличных identifier_value и число идентификаторов документов, которые являются нулевыми.

Например, для вышеупомянутого json результат должен быть следующим: 9a967788-ad44-499e-93e8-3ce6544f3786, 1.

Не могу представить, как будет выглядеть такой запрос. Любая помощь приветствуется!

1 Ответ

1 голос
/ 10 октября 2019

Вы можете использовать функцию 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.

In 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 <> скрипка.

Прочтите в документации:

...