JSONB nahradiť hodnoty špecifickej tlačidlo Postgresql

0

Otázka

Potrebujem nahradiť hodnoty špecifické kľúče vo vnútri jsonb objekt v 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;

Tento kód sa tu poskytuje nasledujúci výsledok:

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

Namiesto nahradiť všetky výskyty "text1", rád by som sa vymeniť len, že text vo vnútri hodnota "key1": ako môžem to urobiť?

Výsledkom aktualizácie by mal byť niečo ako:

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

AKTUALIZOVANÉ požadovaný výsledok, to nebolo dostatočne jasné.

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

Najlepšiu odpoveď

1

Použite funkciu jsonb_build_object().

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

Skúška v Db<>husle.

2021-11-22 14:25:16

To je všetko, ďakujem vám!
Stefano De Rosso
0

Môžete použiť operátor || do kontaktu dve JSON dát a generovanie nových JSON údajov. Teraz môžeme použiť || pripojiť staré JSON dát na nový JSON údajov (Ako je napríklad: {"key2": "text2"})

Demo

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

P. S:

Tiež, môžete použiť jsonb_set funkcia na zmenu údajov.

Demo

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

Chcem existujúci text, ak chcete zostať neporušený, tak to funguje, iba ak je hodnota "text1" a chcem to zmeniť na "text2", ale keď som si "aaaaaa text1" a chcem to zmeniť na "aaaaaa text2" nefunguje to. Potrebujem nahradiť časť reťazec, nie aktualizovať celý reťazec.
Stefano De Rosso

V iných jazykoch

Táto stránka je v iných jazykoch

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