JSONB zastępuje wartość danego klucza Postgresql

0

Pytanie

Muszę wymienić wartości określonych kluczy wewnątrz obiektu jsonb w 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;

Ten kod tutaj daje następujący wynik:

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

Zamiast tego, aby zastąpić wszystkie wystąpienia "text1", chciałbym wymienić tylko ten tekst wewnątrz wartości "key1": jak mam to zrobić?

Wynikiem aktualizacji powinno być coś takiego:

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

ZAKTUALIZOWAŁEM pożądany wynik, był wystarczająco jasny.

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

Najlepsza odpowiedź

1

Użyj funkcjijsonb_build_object().

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

Sprawdź to w Db<>skrzypce.<>

2021-11-22 14:25:16

To wszystko, dziękuję!
Stefano De Rosso
0

Możesz użyć operatora || do komunikacji z dwoma danych JSON i tworzenia nowych danych JSON. Teraz możemy użyć || do łączenia starych danych JSON z nowymi danymi JSON (np.: {"key2": "text2"})

DEMONSTRACJA

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

P. S:

Ponadto, można użyć jsonb_set funkcja do zmiany danych.

DEMONSTRACJA

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

Chcę, aby istniejący tekst pozostał nietknięty, więc to działa tylko w przypadku, jeśli wartość "text1", i chcę go zmienić na "text2", ale jeśli mam "aaaaaa text1", i chcę go zmienić na "aaaaaa text2", to nie działa. Muszę wymienić część wiersza, a nie aktualizować cały wiersz w całości.
Stefano De Rosso

W innych językach

Ta strona jest w innych językach

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