Есть разные варианты.
Можно работать с JSONB
по-человечески:
функция jsonb_set() меняет значение по пути внутри JSON. В вашем случае как-то так:
jsonb_set(ExternalUrls, '{0,Url}', '"https://example/browse/CP-12"')
- заменит ключ Url в элементе с индексом 0 массива из ExternalUrls. Она возвращает новый JSONB объект, обновление колонок таблиц в SQL в любом случае делается через UPDATE:
UPDATE ExternalWorkItems
SET ExternalUrls = jsonb_set(ExternalUrls, '{0,Url}', '"https://example/browse/CP-12"');
Есть некоторая проблемка в том, что jsonb_set меняет одно значение, т.е. нельзя использовать "мульти-путь" типа
{*,Url}
, чтобы поменять сразу все элементы массива ExternalUrls (если у вас их там больше одного).
Проблема решаемая через серию подзапросов с применением функций jsonb_array_elements() -> jsonb_set() -> jsonb_agg(), но уж какая-то монструозная выходит конструкция.
К тому же, если вам надо заменить часть строки (судя по всему, домен в ссылке), не трогая остальное, все становится еще хуже. Как-то так:
UPDATE ExternalWorkItems
SET ExternalUrls = jsonb_set(
ExternalUrls, '{0,Url}',
to_jsonb(replace(ExternalUrls #>> '{0,Url}', 'test', 'example'))
);
(опять поменяет только первый элемент массива ExternalUrls)
Посему, предлагается небольшой костыль в виде конвертации JSONB в текст и простой замене (с некоторым риском заменить не то, что нужно... но если вы уверены в структуре, то это не проблема):
UPDATE ExternalWorkItems SET ExternalUrls = replace(ExternalUrls::text, 'https://test', 'https://example')::jsonb;