Как корректно распарсить с разной структурой JSON строки в одну колонку (PostgreSQL)?
Есть таблица, где в колонке pars_col лежит разная структура json строк. Один тип строки: {'values': [{'test': 'A', 'values': [{'value': 8, 'test': 'B'}]}]}, второй тип строки: {'values': [{'value': 21.0, 'test': 'D'}]}. В одной строке может быть несколько value с разными значениями и с разными наименованиями в test. Мне нужно в каждой строке вытащить все value и просуммировать их. Всё это нужно сохранить в одной колонке.
У кода было несколько ошибок, спасибо @ValNik, благодаря его комментарию стало намного лучше. Осталась одна проблема, мой код из строк с двойным вложением массива не вытаскивает все значения.
Например, в таблице вложена строка: {"values": [{"test": "A", "values": [{"value": 2, "test": "B"}]}, {"test": "D", "values": [{"value": 3, "test": "E"}]}]}'::TEXT), код из нее вытащит только 2, а надо чтобы вытащил 2 и 3 и сложил их.
Мой код:
-- временная таблица для примера
CREATE TEMP VIEW df AS
SELECT
prg_id,
name,
dt,
pars_col::json as pars_col
FROM
(
SELECT
prg_id,
name,
dt,
pars_col
FROM
(VALUES
(1, 'Product A', '2023-01-01'::DATE, '{"values": [{"test": "A", "values": [{"value": 8, "test": "B"}]}]}'::TEXT),
(2, 'Product B', '2023-02-01'::DATE, '{"values": [{"value": 21.0, "test": "D"}]}'::TEXT),
(23, 'Product C', '2023-01-01'::DATE, '{"values": [{"test": "A", "values": [{"value": 5, "test": "B"}]}, {"value": 10, "test": "D"}]}'::TEXT),
(245, 'Product D', '2023-02-01'::DATE, '{"values": [{"test": "A", "values": [{"value": 2, "test": "B"}]}, {"test": "D", "values": [{"value": 3, "test": "E"}]}]}'::TEXT),
(32, 'Product E', '2023-01-01'::DATE, '{"values": [{"value": 15, "test": "F"}]}'::TEXT),
(31, 'Product G', '2023-02-01'::DATE, '{"values": [{"test": "G", "values": [{"value": 7, "test": "H"}]}]}'::TEXT)
) AS data(prg_id, name, dt, pars_col)
) as sub;
-- запрос, с помощью которого я пытаюсь распарсить строки в колонке pars_col
SELECT
prg_id,
name,
dt,
sum(combined.value)
FROM df
CROSS JOIN LATERAL (
SELECT
SUM((elem ->> 'value')::numeric) AS value
FROM
pg_catalog.json_array_elements(pars_col -> 'values') AS elem
UNION
SELECT
SUM((elem2 ->> 'value')::numeric) AS value
FROM
pg_catalog.json_array_elements((pars_col -> 'values') -> 0 -> 'values') AS elem2
) AS combined
GROUP BY prg_id, name, dt
В таблице видно, что prg_id 245 не полностью вытащил value. Пожалуйста, помогите исправить ошибку.