#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. Звучит как второй вопрос.