LINUX.ORG.RU

postgresql, jsonb и select

 , ,


0

1

День добрый.

Вот такой вопрос возник. Есть таблица item с полем jsonb и в том жысоне есть такая запись:

{
  "time":{
    "start":"2022-10-12T10:00:00Z",
    "end":"2022-10-12T10:05:00Z",
    ...
  }
}

Хочется вытащить в один select эти поля и запихать в таблицу вида (id, time_t, time_v), где id это id записи в таблице item, time_t это тип времени («start», «end», etc ), ну а time_v это само значение.

Может кто-нибудь подсказать как правильно это сделать?

Я попытался сделать через jsonb_each_text и jsonb_extract_path.
И в результате запроса select jsonb_each_text(jsonb_extract_path( item.data, 'time' )) from item я получаю нечто вида

"(end,1998-10-13T06:58:33Z)"
"(gen,2022-05-16T09:08:57Z)"
"(start,1998-10-13T06:51:55Z)"
"(end,1993-08-25T21:39:23Z)"

В доке по jsonb_each_text советуют делать select * from jsonb_each_text(), но как тут это сделать чтобы получить нормальный результат с полями, я что-то не понимаю.

★★★★★

Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от Aswed

select item.data -> 'time' from item вернёт по сути тот же json, что и jsonb_extract_path вида:

{
  "end": "1998-10-13T06:58:33Z",
  "start": "1998-10-13T06:51:55Z"
}

Но дело в том, что вот этих «start»,«end», etc несколько видов и они могут встречаться в разных комбинациях. А то конечно можно было бы просто сделать select item.data #>> '{ time, start }' from item; и не было бы проблем.

А вот jsonb_each_text возвращает список наборов ключ-значение.

WatchCat ★★★★★
() автор топика
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от WatchCat

Наверное, я поспешил написать. Кажется, что LATERAL не для этого. Вообще, не знаю, если бы было время создать пример данных и поиграть с запросами, попробовал бы, но его нет. :)

emorozov
()
Ответ на: комментарий от Jini

О-о-о-о, спасибо тебе добрый человек. То что надо. Жаль тут нельзя плюс в репу поставить.

UPD. что-то не подумал что item и json_each можно одновременно в from добавить. Как я и сказал, недостаточно копенгаген в sql.

WatchCat ★★★★★
() автор топика
Последнее исправление: WatchCat (всего исправлений: 2)