Собрать и суммировать значения из массива PostgreSQL jsonb объектов - PullRequest
0 голосов
/ 25 января 2020

ОБНОВЛЕНИЕ 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: []
    },
    ...
    ],
  ...
}

...