powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сформировать jsonb из массива строк другой таблицы
2 сообщений из 2, страница 1 из 1
Сформировать jsonb из массива строк другой таблицы
    #39805129
neuro_75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Только начинаю изучать PostgreSQL, не пинайте сильно.
Есть таблицы
а) main:
stat_id | consolidate
integer | jsonb
-------------------------------
10000 |
..... |
n |

б) stat_value
stat_id | func_id | value
integer | integer | varchar
-------------------------------------------
10000 | 123 | Значение_1
10000 | 234 | Значение_2
10000 | ... | Значение_3
... | ... | ...
n | m | Значение_n

в) func_name
func_id | func_name
integer | varchar
-------------------------------
123 | name_1
234 | name_2
... | ...
m | name_n

Т.е. для каждого stat_id может быть произвольное количество func_id, значения и названия которых определены в таблицах stat_value и func_name.
Мне нужно для каждого stat_id собрать в первой таблице jsonb-поле consolidate вида:
{"name_1" :{'func_id':123, 'value': "Значение_1"}, "name_2" :{'func_id':234, 'value': "Значение_2"}, ... , "name_n" :{'func_id':m, 'value': "Значение_n"}}

Всю голову сломал, документацию читал, не могу реализовать, прошу помочь.
Параметров, которые надо в jsonb внести и, соответственно участвующих таблиц, на самом деле больше, но мне сам принцип бы понять на данном упрощенном примере.
...
Рейтинг: 0 / 0
Сформировать jsonb из массива строк другой таблицы
    #39805564
neuro_75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такая конструкция, подсказанная в slack-канале Postgres'a :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
    stat_id,
    jsonb_object_agg(
        func_name, jsonb_build_object(
            'func_id', func_name.func_id,
            'value', stat_value.value
     )
 )
FROM main
     INNER JOIN stat_value ON main.stat_id = stat_value.stat_id
     INNER JOIN func_name ON func_name.func_id = stat_value.func_id
GROUP BY 1;


возвращает требуемые значения, а именно объединяет значения в поле jsonb и выводит таблицу (запятые между парами точками заменил на точки, а то редактор их воспринимает как разделитель столбцов):
stat_idconsolidate10000{"name_1" :{'func_id':123. 'value': "Значение_1"}. "name_2" :{'func_id':234. 'value': "Значение_2"}. ... . "name_n" :{'func_id':m. 'value': "Значение_n"}}......

Вместе с тем, строится новая итоговая таблица с этими двумя столбцами, а мне нужно записать данные в поле consolidate уже имеющейся.
Пробовал так:
Код: plsql
1.
2.
3.
4.
UPDATE main
SET consolidate = SELECT jsonb_object_agg(
        func_name, jsonb_build_object(
        ..... и далее по тексту запроса


ругается что UPDATE не может содержать агрегатную функцию.
Пробовал вынести SELECT в блок WHERE:
Код: plsql
1.
2.
3.
4.
5.
6.
UPDATE main
SET consolidate = consolidate
WHERE consolidate = SELECT jsonb_object_agg(
        func_name, jsonb_build_object(
        ..... 
        GROUP  BY 1);


На этот раз ругается, что GROUP BY не может содержать агрегатную функцию. Если же GROUP BY вообще убрать, то запрос отрабатывает, но возвращает пустые значения в столбце consolidate.
Я также не уверен, что запись SET consolidate = consolidate WHERE consolidate = SELECT ... корректна (какое-то масло масляное), однако логичная попытка ввести переменную (SET consolidate = $var WHERE $var = SELECT ... ) в Postgres не работает.
Как можно сделать UPDATE в такой ситуации?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сформировать jsonb из массива строк другой таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]