ОБНОВЛЕНИЕ 1: Я вычислил следующий скрипт для получения суммы продолжительности на всех шагах:
SELECT sum(x)
FROM (
SELECT (
jsonb_array_elements(data->'steps')->>'duration'
)::numeric x
FROM my_table WHERE id = 'gg464jfiwnf92j0d9crr'
) a;
, но как включить это в jsonb_set вопрос сейчас. Я получаю эту ошибку:
ОШИБКА: функция jsonb_set (jsonb, неизвестно, число c, логическое значение) не существует
LINE 2: SET data = jsonb_set ( ^
СОВЕТ: ни одна функция не соответствует заданному имени и типу аргумента. Возможно, вам придется добавить явное приведение типов.
... когда я пытаюсь это сделать:
UPDATE my_table
SET data = jsonb_set(
data,
'{duration}',
(SELECT sum(x) FROM (select (jsonb_array_elements(data->'steps')->>'duration')::numeric x from my_table where id = 'gg464jfiwnf92j0d9crr') a),
false
);
ОРИГИНАЛЬНАЯ ПОЧТА:
В моей таблице PostgreSQL есть столбец data
, который введите jsonb. Он содержит объект из строк, массивов и объектов, и один из этих массивов - это мой целевой массив steps
.
Цель состоит в том, чтобы собрать общую продолжительность всех шагов и поместить в строку верхнего уровня с именем duration
.
OLD: Я полагаю, что хочу извлечь все значения «duration» из каждого объекта step
и суммировать их, но я не знаю, как собирать элементы из разных объектов в массив, чтобы затем суммировать. Как бы я это сделал?
NEW: Теперь мне нужно вычислить Узнайте, как использовать найденный сценарий SUM или другой сценарий для обновления значения jsonb.
структура jsonb:
data:
{
x_string: 'some value',
y_array: ['a', 'b', 'pi'],
steps: [{
description: 'This is the first step\'s description',
duration: '12',
attachments: []
},
description: 'This is the seconds step\'s description blah blah',
duration: '43',
attachments: []
},
...
],
...
}
Здесь я на данный момент:
UPDATE my_table
set data = jsonb_set(
data,
'{duration}',
SUM (
// somehow make an array of each objects `duration` value
SELECT jsonb_array_elements(data->>'steps') // ??
),
true);
(Документы по операциям JSONB https://www.postgresql.org/docs/9.5/functions-json.html)
И в конечном итоге получить:
data:
{
x_string: 'some value',
y_array: ['a', 'b', 'pi'],
duration: 80, <----- GOAL
steps: [{
description: 'This is the first step\'s description',
duration: '12',
attachments: []
},
description: 'This is the seconds step\'s description blah blah',
duration: '43',
attachments: []
},
...
],
...
}