JSONB înlocui valoarea de o anumită cheie Postgresql

0

Problema

Am nevoie pentru a înlocui valorile specifice cheile în interiorul unui jsonb obiect în 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;

Acest cod aici dă următorul rezultat:

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

În loc de a înlocui toate aparițiile "text1", aș vrea să înlocuiți numai că textul în valoare de "cheie1": cum fac asta?

Rezultatul de actualizare ar trebui să fie ceva de genul:

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

ACTUALIZAT rezultatul dorit, nu a fost suficient de clar.

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

Cel mai bun răspuns

1

Utilizați funcția jsonb_build_object().

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

Testați-l în Db<>vioara.

2021-11-22 14:25:16

Asta e, multumesc!
Stefano De Rosso
0

Puteți folosi operatorul || pentru a contacta două date JSON și de a genera noi date JSON. Acum putem folosi || să se alăture vechi date JSON pentru noi date JSON (Cum ar fi: {"key2": "text2"})

Demo

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

P. S:

De asemenea, puteți utiliza jsonb_set funcție pentru a modifica datele.

Demo

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

Vreau textul existent să rămână intacte, astfel încât aceasta funcționează numai dacă valoarea este "text1" și vreau să-l schimbe la "text2", dar dacă am "aaaaaa text1" și vreau să-l schimbe la "aaaaaa text2" nu merge. Am nevoie pentru a înlocui o parte din șir, nu pentru a actualiza întregul șir.
Stefano De Rosso

În alte limbi

Această pagină este în alte limbi

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