Тип данных Postgres JSONB - Как извлечь данные из поля JSON (типа JsonB) базы данных postgres?

Здравствуйте, друзья! Мне нужна помощь в решении следующей проблемы.

У меня есть набор записей в моей таблице postgres db, где таблица имеет поле типа JSONB.

Столбец типа JSONB содержит следующие JSON,

Запись №1: -

{
  "key1": "value1",
  "key2": "value2",
  "audience": [
    {
      "name": "Person1",
      "email": "[email protected]",
      "country": "UK",
      "primaryNumber": "+1234567890",
      "secondaryNumber": "+1234567890"
    },
    {
      "name": "Person2",
      "email": "[email protected]",
      "country": "UK",
      "primaryNumber": "+1234567890",
      "secondaryNumber": "+1234567890"
    }
  ]
}

Запись №2: -

{
  "key1": "value1",
  "key2": "value2",
  "audience": [
    {
      "name": "Person3",
      "email": "[email protected]",
      "country": "UK",
      "primaryNumber": "+1234567890",
      "secondaryNumber": "+1234567890"
    },
    {
      "name": "Person4",
      "email": "[email protected]",
      "country": "UK",
      "primaryNumber": "+1234567890",
      "secondaryNumber": "+1234567890"
    }
  ]
}

Ожидаемый результат (охват всей аудитории): -

[
  {
    "name": "Person1",
    "email": "[email protected]",
    "country": "UK",
    "primaryNumber": "+1234567890",
    "secondaryNumber": "+1234567890"
  },
  {
    "name": "Person2",
    "email": "[email protected]",
    "country": "UK",
    "primaryNumber": "+1234567890",
    "secondaryNumber": "+1234567890"
  },
  {
    "name": "Person3",
    "email": "[email protected]",
    "country": "UK",
    "primaryNumber": "+1234567890",
    "secondaryNumber": "+1234567890"
  },
  {
    "name": "Person4",
    "email": "[email protected]",
    "country": "UK",
    "primaryNumber": "+1234567890",
    "secondaryNumber": "+1234567890"
  }
]

Может ли кто-нибудь помочь мне разработать запрос через native query или через spring-data-jpa?

Я очень признателен, если кто-нибудь может помочь мне выйти из этой ситуации!


person Vishal Gajera    schedule 05.09.2018    source источник
comment
это может помочь: postgresql.org/docs/current/static/functions- json.html   -  person Tryph    schedule 05.09.2018
comment
@Tryph Сначала я попытался решить эту проблему. но, похоже, я не могу решить такой запрос в соответствии с ожиданиями. поэтому я открыто прошу, кто может мне помочь. Спасибо за ваш ответ.   -  person Vishal Gajera    schedule 05.09.2018


Ответы (1)


Вы должны извлечь 'audience' элементов массива каждой строки с помощью jsonb_array_elements() и объединить их в один объект json с jsonb_agg():

select jsonb_agg(value)
from my_table
cross join jsonb_array_elements(json_data->'audience')

Рабочий пример в rextester.

person klin    schedule 05.09.2018