JSONB sostituire il valore di una chiave di Postgresql

0

Domanda

Ho bisogno di sostituire i valori di chiavi all'interno di un jsonb oggetto di 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;

Questo codice qui dà il seguente risultato:

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

Invece di sostituire tutte le occorrenze di "testo1", vorrei sostituire solo il testo all'interno il valore di "key1": come la faccio?

Il risultato dell'aggiornamento dovrebbe essere qualcosa di simile:

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

AGGIORNATO il risultato desiderato, non era abbastanza chiaro.

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

Migliore risposta

1

Utilizzare la funzione jsonb_build_object().

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

Il Test in Db<>violino.

2021-11-22 14:25:16

Questo è tutto, grazie!
Stefano De Rosso
0

È possibile utilizzare l'operatore || a contatto i due dati JSON e generare nuovi dati in formato JSON. Ora siamo in grado di utilizzare || per partecipare vecchi dati JSON a nuovi dati in formato JSON (Come: {"key2": "text2"})

Demo

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

P. S:

Inoltre, è possibile utilizzare jsonb_set funzione per modificare i dati.

Demo

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

Voglio il testo esistente per rimanere intatto, quindi funziona solo se il valore è "testo1" e voglio cambiare "testo2", ma se ho "aaaaaa testo1" e voglio cambiare "aaaaaa testo2" non funziona. Ho bisogno di sostituire una porzione di stringa, di non aggiornare l'intera stringa.
Stefano De Rosso

In altre lingue

Questa pagina è in altre lingue

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