Объединение столбца Postgresql jsonb с данными строки

#json #postgresql

#json #postgresql

Вопрос:

У меня есть таблица данных со столбцом и идентификатором и столбцом jsonb с данными объекта:

id (int) данные (jsonb)

Я запрашиваю данные следующим образом

 select row_to_json(t)
from (
    select id, data from accounts
) t;
  

что дает мне данные, которые выглядят следующим образом:

 {
   "id":3,
   "data":
   {
      "emailAddress": "someone@gmail.com", 
      "mobileNumbers": ["5559991212"]
   }
}
  

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

 {
   "id":3,
   "emailAddress": "someone@gmail.com", 
   "mobileNumbers": ["5559991212"]
}
  

Ответ №1:

Вы можете использовать

 SELECT jsonb_set(data, '{id}', to_jsonb(id))
FROM accounts;
  

Я не могу не отметить, что таблица, содержащая только первичный ключ и jsomb столбец, кажется мне проблематичным дизайном базы данных.

Комментарии:

1. Спасибо за отзыв, я значительно упростил дизайн таблицы, опустив другие столбцы. Я использую подход, который хранит объекты в jsonb, но денормализует данные в столбцы для поиска и присоединения к другим таблицам объектов.

2. Ах, это звучит лучше.

3. Это правильный ответ, и я пометил его как таковой. Могу ли я попросить немного больше советов, которые основаны на первом вопросе?

4. У меня есть две связанные таблицы с таблицей accounts, которые равны 1 ..n, я хочу захватить эти данные и вложить их в данные из таблицы account. Возникли проблемы, я могу сделать так, чтобы другие массивы данных были смежными, но не вложенными: SELECT jsonb_set(data, '{id}', to_jsonb(id)) account, ( SELECT array_to_json(array_agg(jsonb_set(data, '{id}', to_jsonb(id)))) FROM people WHERE account_id = accounts.id ) people FROM accounts;

5. Звучит как второй вопрос.