JSONB заменяет значение определенного ключа Postgresql

0

Вопрос

Мне нужно заменить значения определенных ключей внутри объекта jsonb в Postgresql:

create table content (
  id int,
  dynamic_fields jsonb
  );
  
insert into content values (0, '{
    "key1": "aaaaa text1",
    "key2": "text1",
    "key3": "blabla"}'::jsonb);

UPDATE content 
SET dynamic_fields = replace(dynamic_fields::text, 'text1', 'text2')::jsonb;

Этот код здесь дает следующий результат:

id |    dynamic_fields  
0  |  {"key1": "aaaaa text2", "key2": "text2", "key3": "blabla"}

Вместо того, чтобы заменять все вхождения "text1", я хотел бы заменить только этот текст внутри значения "key1": как мне это сделать?

Результатом обновления должно быть что-то вроде:

id |    dynamic_fields  
0  |  {"key1": "aaaaa text1", "key2": "text2", "key3": "blabla"}

ОБНОВИЛ желаемый результат, он был недостаточно ясен.

jsonb postgresql replace
2021-11-22 13:55:53
2

Лучший ответ

1

Используйте функциюjsonb_build_object().

update content
set dynamic_fields = 
    dynamic_fields || 
    jsonb_build_object('key1', replace(dynamic_fields->>'key1', 'text1', 'text2'))
where dynamic_fields ? 'key1'

Проверьте это в Бд<>скрипка.<>

2021-11-22 14:25:16

Вот и все, спасибо!
Stefano De Rosso
0

Вы можете использовать оператор || для связи с двумя данными JSON и создания новых данных JSON. Теперь мы можем использовать || для объединения старых данных JSON с новыми данными JSON (например: {"key2": "text2"})

ДЕМОНСТРАЦИЯ

update content
set dynamic_fields = dynamic_fields || '{"key2": "text2"}'::jsonb;

P. S:

Кроме того, вы можете использовать jsonb_set функция для изменения данных.

ДЕМОНСТРАЦИЯ

update content
set dynamic_fields = jsonb_set(dynamic_fields, '{key2}', '"text2"');
2021-11-22 14:09:06

Я хочу, чтобы существующий текст оставался нетронутым, поэтому это работает только в том случае, если значение "text1", и я хочу изменить его на "text2", но если у меня есть "aaaaaa text1", и я хочу изменить его на "aaaaaa text2", это не работает. Мне нужно заменить часть строки, а не обновлять всю строку целиком.
Stefano De Rosso

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................