1

Тема: Postgresql заміна слів в jsonb колонці

Можете підказати як можна замінити 'https://investor-bucket.s3.eu-central-1.amazonaws.com' на '/uploads', в колонці з форматом jsonb?

Post's attachments

Screenshot_1.jpg 93.92 kb, 77 downloads since 2020-12-17 

2 Востаннє редагувалося frz (17.12.2020 18:50:31)

Re: Postgresql заміна слів в jsonb колонці

1. Ви просите про допомогу, але робите це без поваги (с). Надавати початковий код скріншотом, а не текстом - це без коментарів...

2. Якщо розмір значення jsonb дозволяє, тоді просто конвертуємо у varchar, далі робимо потрібну заміну за допомогою replace, далі конвертуємо назад у jsonb. Оскільки значення jsonb в тексті я не маю (див. попередній пункт), то вигадав своє.

with raw_data as (
    select cast('{"tags": {"nk594127": {"ik71786": "iv678771"}}, "braille": false, "keywords": ["https://investor-bucket.s3.eu-central-1.amazonaws.com", "kef", "keh"], "hardcover": true, "publisher": "EfgdxUdvB0", "criticrating": 1}' as jsonb) as t1
),
step_1 as (
    select cast(t1 as varchar) as t1a from raw_data
), 
step_2 as (
    select replace(t1a,'https://investor-bucket.s3.eu-central-1.amazonaws.com','/uploads') as t1b from step_1
)
select cast(t1b as jsonb) as t1c from step_2;

було:

{"tags": {"nk594127": {"ik71786": "iv678771"}}, "braille": false, "keywords": ["https://investor-bucket.s3.eu-central-1.amazonaws.com", "kef", "keh"], "hardcover": true, "publisher": "EfgdxUdvB0", "criticrating": 1}

стало:

{"tags":{"nk594127":{"ik71786":"iv678771"}},"braille":false,"keywords":["/uploads","kef","keh"],"hardcover":true,"publisher":"EfgdxUdvB0","criticrating":1}

(CTE "with" використав для кращої наочності - все можна спростити до єдиного селекту)

Подякували: plusxx, shtyegor, fed_lviv3

3

Re: Postgresql заміна слів в jsonb колонці

Дуже дякую!

В мене вийшло ось так:

UPDATE upload_file
SET formats = cast(REPLACE(cast(formats as varchar), 'https://investor-bucket.s3.eu-central-1.amazonaws.com', '/uploads') as jsonb);

Може комусь допоможе

4

Re: Postgresql заміна слів в jsonb колонці

Пан frz гарно Вам написав:

frz написав:

1. Ви просите про допомогу, але робите це без поваги (с). Надавати початковий код скріншотом, а не текстом - це без коментарів...

Я б хіба додав - кінцевий варіант буде залежати від багатьох моментів - розміру таблиці (таблиць), індексів, структури JSON, розміру того ж JSON і тд. Бо якщо дивитися на Ваш короткий опис, перше на що я б звернув увагу - jsonb_set для прикладу:

jsonb_set ( some_field, '{large,url}', to_jsonb ( REPLACE ( some_field -> 'large' ->> 'url', 'https://football.ua', '/uploads' ) ), FALSE )

але звісно кінцевий варіант залежить від вище перерахованих нюансів.

Подякували: shtyegor1