JSONB de substituir o valor de uma chave específica Postgresql

0

Pergunta

Eu preciso substituir os valores de chaves específicas dentro de um jsonb objeto no 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;

Este código até aqui dá o seguinte resultado:

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

Em vez de substituir todas as ocorrências de "texto1", eu gostaria de substituir apenas que o texto dentro do valor de "key1": como eu faço isso?

O resultado da atualização deve ser algo como:

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

ATUALIZADO o resultado desejado, não era claro o suficiente.

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

Melhor resposta

1

Use a função jsonb_build_object().

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

Teste-o em Db<>violino.

2021-11-22 14:25:16

É isso, obrigado!
Stefano De Rosso
0

Você pode usar o operador || para entrar em contato com dois dados JSON e gerar novos dados JSON. Agora podemos usar o || para participar de idade de dados JSON para novos dados JSON (Como: {"key2": "text2"})

Demonstração

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

P. S:

Além disso, você pode usar jsonb_set função para alterar os dados.

Demonstração

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

Eu quero que o texto existente para permanecer intactos, de modo que este só funciona se o valor for "texto1" e quero mudá-lo para "texto2", mas se eu tiver "aaaaaa texto1" e quero mudá-lo para "aaaaaa texto2" não funciona. Eu preciso substituir uma parte da seqüência de caracteres, a não atualização de toda a cadeia.
Stefano De Rosso

Em outros idiomas

Esta página está em outros idiomas

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