Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Подсчитать сумму элементов jsonb


Автор: polin11 23.1.2025, 02:34
Использую PGSQL.
Есть 2 поля в таблице One(jsonb), Two(jsonb)

каждое поле всегда состоят из 3 jsonb элементов

Код

Пример:
One: [{'А': 10, 'B': 5},{'C': 6},{'D': 1}]
Two: [{'A_1': 'A_2', 'A_3': 'A_4'}, {'B_1': 'B_2'}, {'D_1': 'D_2'}]


Для поля One  нужно посчитать сумму всех элементах во всех 3 jsonb для примера выше
сумма будет 10+5+6+1=22.

Для поля Two  нужно посчитать количество всех ключей во всех 3 json для примера выше
количество будет 4.

Написал такой запрос

Код

select 
    (
        select sum(v::int) from jsonb_each("One"[0] || "One"[1] || "One"[2]) AS x(k, v)
        where  jsonb_typeof(v) = 'number'  
    ) as "sum_jsonb",
    (
        select count(*) from jsonb_object_keys("Two"[0] || "Two"[1] || "Two"[2]) 
    ) as "count_jsonb"
from T


Проблема возникла, что запрос не выполняется на PGSQL 10 и ниже, в нем нельзя обращаться к jsonb по индексу "One"[0].
Просьба помочь, как проще написать данный запрос, чтобы можно было выполнить на старой версии PGSQL

Автор: LSD 23.1.2025, 17:18
Цитата(polin11 @  23.1.2025,  03:34 Найти цитируемый пост)
в нем нельзя обращаться к jsonb по индексу "One"[0]

Но можно обращаться через 
Код

"One"->0


Автор: Akina 26.1.2025, 14:27
Цитата(polin11 @  23.1.2025,  03:34 Найти цитируемый пост)
Пример:

Пример правильнее давать в виде готового к употреблению CREATE TABLE + INSERT INTO.
Ещё правильнее - в виде готового fiddle.

Автор: LSD 27.1.2025, 23:49
А как правильно давать непрошенные советы?

Автор: Akina 28.1.2025, 09:13
Правильно - игнорировать сообщения, которые тебе не нравятся.

Автор: LSD 28.1.2025, 13:16
Akina, можешь улучшить ответ - делай. А советы кому-как надо отвечать оставь при себе.

Заодно можешь последовать своему же совету:
Цитата(Akina @  28.1.2025,  10:13 Найти цитируемый пост)
игнорировать сообщения, которые тебе не нравятся


Автор: Akina 28.1.2025, 15:27
Цитата(LSD @  28.1.2025,  14:16 Найти цитируемый пост)
А советы кому-как надо отвечать оставь при себе.

Ну если всё же прочитать то, что мной написано, то выяснится, что совет был не тому, кто отвечает, а тому, кто спрашивает. Это к слову. 
А если бы автор сразу оформил вопрос с приведением SQL-скриптов для воссоздания таблицы, то он мог бы получить сразу готовый и пригодный к использованию ответ, к тому же проверенный практически на его же структуре и данных. Я уж не говорю о том, что одиночные кавычки в JSON вызовут у PostgreSQL приступ негодования...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)