Postgres JSONB тип данных - Как извлечь данные из поля JSON (типа JsonB) базы данных postgres? - PullRequest
0 голосов
/ 05 сентября 2018

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

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

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

Запись № 1: -

{
  "key1": "value1",
  "key2": "value2",
  "audience": [
    {
      "name": "Person1",
      "email": "test1@mail.com",
      "country": "UK",
      "primaryNumber": "+1234567890",
      "secondaryNumber": "+1234567890"
    },
    {
      "name": "Person2",
      "email": "test2@mail.com",
      "country": "UK",
      "primaryNumber": "+1234567890",
      "secondaryNumber": "+1234567890"
    }
  ]
}

Запись № 2: -

{
  "key1": "value1",
  "key2": "value2",
  "audience": [
    {
      "name": "Person3",
      "email": "test3@mail.com",
      "country": "UK",
      "primaryNumber": "+1234567890",
      "secondaryNumber": "+1234567890"
    },
    {
      "name": "Person4",
      "email": "test4@mail.com",
      "country": "UK",
      "primaryNumber": "+1234567890",
      "secondaryNumber": "+1234567890"
    }
  ]
}

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

[
  {
    "name": "Person1",
    "email": "test1@mail.com",
    "country": "UK",
    "primaryNumber": "+1234567890",
    "secondaryNumber": "+1234567890"
  },
  {
    "name": "Person2",
    "email": "test2@mail.com",
    "country": "UK",
    "primaryNumber": "+1234567890",
    "secondaryNumber": "+1234567890"
  },
  {
    "name": "Person3",
    "email": "test3@mail.com",
    "country": "UK",
    "primaryNumber": "+1234567890",
    "secondaryNumber": "+1234567890"
  },
  {
    "name": "Person4",
    "email": "test4@mail.com",
    "country": "UK",
    "primaryNumber": "+1234567890",
    "secondaryNumber": "+1234567890"
  }
]

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

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

1 Ответ

0 голосов
/ 05 сентября 2018

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

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

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

...