LINUX.ORG.RU

Замена в jsonb значения

 ,


0

2

Использую POSTGRESQL, есть таблица с полем jsonb

select *
from 
(
values
(1, '{"name":["Иванов","Сидоров"], "town":"Paris"}'::jsonb),
(2, '{"name":["Иванов","Сергеев"], "town":"Berlin"}'::jsonb),
(3, '{"name":["Марков"], "town":"Rome"}'::jsonb)
) as q (id, data)
https://www.db-fiddle.com/f/dMK5uHZ8Thxnk57hi7f4wN/0

Нужно в массиве по ключу name заменить Иванов на Петров, в итоге, чтобы получилось

1	{"name":["Петров","Сидоров"],"town":"Paris"}
2	{"name":["Петров","Сергеев"],"town":"Berlin"}
3	{"name":["Марков"],"town":"Rome"}
Моих знаний хватило только, для разбиения на массив фамилий и ид. записей
select id, jsonb_array_elements(data->'name')
from 
(
values
(1, '{"name":["Иванов","Сидоров"], "town":"Paris"}'::jsonb),
(2, '{"name":["Иванов","Сергеев"], "town":"Berlin"}'::jsonb),
(3, '{"name":["Марков"], "town":"Rome"}'::jsonb)
) as q (id, data)
Просьба помочь написать запрос

Я наверное несколько старомоден, и DDIA плохо прочитал, но ничего кроме пожелания об отмене моратория на ВМСЗ мне в голову не приходит.

dimgel ★★★★★
()

Сама по себе задача странная ... я, ниразу не иксперд, сделал бы через CTE: в первом удалить Ивановых и вернуть айди, а вторым добавить Петровых по айди из предыдущего CTE.

joy4eg ★★★★★
()
Последнее исправление: joy4eg (всего исправлений: 1)

Нужно в массиве по ключу name заменить Иванов на Петров, в итоге, чтобы получилось

А что на эту тему написано в докоментации PostgreSQL, какие, по-вашему, jsonb_* функции подошли бы для решения этой задачи, какие с ними возникли проблемы?

slovazap ★★★★★
()

Неплохо бы, для начала, нормализовать записи. И тогда, чудесным образом, задача еще сильнее упростится.

ComradeDOS
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.