как вставить атрибуты поля postgres jsonb в таблицу ключ-значение?

#postgresql #select #key-value #jsonb

#postgresql #выберите #ключ-значение #jsonb

Вопрос:

Я хочу превратить значения jsonb в таблицу ключ-значение с помощью одного оператора

Мой пример кода:

 CREATE TABLE public.searchdatacache
( querysig text, "values" jsonb );
INSERT INTO searchdatacache (querysig, values)
VALUES 
(
'ytApiSearch://Armageddon trailer',
'[
  {"VideoId"      : "xwseawq"},
  {"Title"        : "Armageddon"},
  {"PublishedAt"  : "2012/01/01"},
  {"Description"  : "Armageddon is a film"},
  {"ChannelTitle" : "Bruce Willis Movies"}
]'
)

SELECT jsonb_array_elements(values) from searchdatacache where querysig =    'ytApiSearch://Armageddon trailer'
  

ВОЗВРАТ:

 "{"VideoId": "xwseawq"}"
"{"Title": "Armageddon"}"
"{"PublishedAt": "2012/01/01"}"
"{"Description": "Armageddon is a film"}"
"{"ChannelTitle": "Bruce Willis Movies"}"
  

данные, возвращаемые оператором select, выглядят нормально
пока, но теперь я хочу использовать этот оператор select
в инструкции «ВСТАВИТЬ В»
для заполнения таблицы ключ-значение.

эти записи должны быть заполнены в новую таблицу ключ-значение:

 VideoId      | xwseawq
Title        | Armageddon
PublishedAt  | 2012/01/01
Description  | Armageddon is a film
ChannelTitle | Bruce Willis Movies
  

заранее спасибо
Джеральд

Ответ №1:

Используйте jsonb_array_elements в from предложении вместе с jsonb_each_text , чтобы подготовить пары ключ-значение к вставке.

 select s.key,s.value
       from searchdatacache cross join lateral
             jsonb_array_elements(values) as j(e)
    cross join lateral jsonb_each_text(j.e) as s(key,value);
  

ДЕМОНСТРАЦИЯ