Предполагая, что вы используете версию Postgres с поддержкой JSON (9.4+), это должно помочь вам:
WITH cte(myJSON) AS (
SELECT CAST('{"foo":{"bar" :["b","c","d"]}}'AS JSONB) AS MyJSON
UNION ALL
SELECT CAST('{"foo":{"bar" :["e","f","g"]}}'AS JSONB) AS MyJSON
)
SELECT
JSON_AGG(
(SELECT ROW_TO_JSON(_) FROM (SELECT name) AS _)
) myrow
FROM (
SELECT JSONB_ARRAY_ELEMENTS(myjson->'foo'->'bar') AS name,
ROW_NUMBER() OVER() AS RowNum
FROM cte
) src
GROUP BY src.RowNum
Это вернет [{"name":"b"},{"name":"c"},{"name":"d"}]
.
Затем вы можете создать свой окончательный JSON
по мере необходимости.
SQL Fiddle
Ссылка
Обновить
Это очень хакерский способ, и я уверен, что есть более чистый способ, но я обновил запрос выше, чтобы он обрабатывал несколько строк. Просто замените ссылки CTE
на фактическое имя таблицы, а myjson
на имя столбца JSON
.
Выход:
[{"name":"b"},{"name":"c"},{"name":"d"}]
[{"name":"e"},{"name":"f"},{"name":"g"}]
Дай мне знать, если это работает.
Обновленное обновление
Вот оператор UPDATE
, который вы можете использовать:
UPDATE t1 tgt
SET jsoncol = JSONB_SET(
jsoncol, -- Source JSON
'{foo,bar}', -- Target node to update
src.new_json -- New value
)
FROM (
SELECT
ID,
JSONB_AGG(
(SELECT TO_JSONB(_) FROM (SELECT name) AS _) -- Convert new row to JSON
) new_json
FROM (
SELECT
ID,
JSONB_ARRAY_ELEMENTS(jsoncol->'foo'->'bar') AS name -- Convert array to rows
FROM t1
) src
GROUP BY src.ID
) src
WHERE tgt.ID = src.ID -- Update "tgt" table with rows from "src" table
;
DB-Fiddle
person
ravioli
schedule
23.09.2019
["name":"b","name":"c","name":"d"]
недействителен, потому что это не объектная нотация. Также не допускаются одинаковые ключи в объекте - person Joven28   schedule 23.09.2019Postgres 9.1
? Похоже, что родная поддержкаJSON
не добавлялась до версии 9.2, аJSONB
— до версии 9.4. - person ravioli   schedule 23.09.2019jsonb
не добавлялся до версии 9.5. - person a_horse_with_no_name   schedule 23.09.2019