JSONB nahradit hodnotu určitého klíče Postgresql

0

Otázka

Potřebuji nahradit hodnoty specifické klíče uvnitř 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 sem dává následující výsledek:

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

Místo nahradí všechny výskyty "text1", chtěl bych si vyměnit pouze to, že text uvnitř hodnotu "key1": jak to mám udělat?

Výsledkem aktualizace by měla být něco jako:

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

AKTUALIZOVÁNO požadovaný výsledek, to nebylo dost jasné.

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

Nejlepší odpověď

1

Použití funkce jsonb_build_object().

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

Test je v Db<>housle.

2021-11-22 14:25:16

To je ono, děkuji!
Stefano De Rosso
0

Můžete použít operátor || pro kontakt dvou JSON dat a generování nových dat JSON. Nyní můžeme použít || připojit starý JSON dat do nového formátu JSON data (Např.: {"key2": "text2"})

Demo

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

P. S:

Také, můžete použít jsonb_set funkce pro změnu data.

Demo

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

Chci stávající text zůstal neporušený, takže to funguje pouze tehdy, pokud je hodnota "text1" a chci to změnit na "text2", ale pokud mám "aaaaaa text1" a chci to změnit na "aaaaaa text2" to nefunguje. Potřebuji nahradit část řetězce, ne se aktualizovat celý řetězec.
Stefano De Rosso

V jiných jazycích

Tato stránka je v jiných jazycích

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