Совокупный JSON дюйм PostgreSQL - PullRequest
3 голосов
/ 27 мая 2020

У меня есть столбец json с записями, которые выглядят следующим образом:

{
  "pages": "64",
  "stats": {
    "1": { "200": "55", "400": "4" },
    "2": { "200": "1" },
    "3": { "200": "1", "404": "13" },
  }
}

«Статистика» - это коллекции (разного размера), содержащие коды состояния http по сравнению с количеством.

Я хотел бы объединить статистику в два вычисляемых столбца - один для общего количества ответов 200, а другой - для общего количества ответов (включая 200 s).

1 Ответ

2 голосов
/ 27 мая 2020

Вы можете использовать два боковых соединения, чтобы разъединить внутренние объекты, а затем выполнить условную агрегацию:

select 
    sum(z.cnt::int) no_responses,
    sum(z.cnt::int) filter(where z.code::int = 200) no_200_responses
from mytable t
cross join lateral jsonb_each(t.data -> 'stats') as x(kx, obj)
cross join lateral jsonb_each_text(x.obj) as z(code, cnt)

Демонстрация на DB Fiddle :

no_responses | no_200_responses
-----------: | ---------------:
          74 |               57
...