1
resposta

[Dúvida] Select dentro de um jsonb_object (usando POSTGRESQL)

eu tenho uma tabela historico que tem uma coluna dados que e um informação json

dadosID
{dataNew:'2020-06-12',dataVelha: '2020-04-11' ,tipo: 'ALTERACAO_DE_PRECO',Id: '1',preco: '239'}5

Quero fazer o update de 2 key , dessa coluna dados.

Minha tentativa falha

UPDATE historico SET dados = 
jsonb_object('{dataNew, dataVelha, tipo, Id, preco}',
'{(SELECT dados ->'dataNovo', 'dataAntiga', 'tipo', 'id', 'preco' FROM historico;)}'  
WHERE id in ( SELECT id FROM historico);

Esse SELECT dados funciona fora do jsonb_object. Não consigo fazer o select funcionar dentro do jsonb_object

1 resposta

Oi, Maria! Tudo certo por aí?

Desde já, peço desculpas pela demora em te responder.

Para atualizar chaves de um objeto JSON, você pode utilizar a seguinte sintaxe:

UPDATE tabela
       SET coluna = REPLACE(coluna::tipo_de_dado, 'chave_antiga', 'chave_nova')::jsonb;

No código acima, utilizamos a cláusula UPDATE para atualizar determinada tabela e a partir de SET, indicamos qual coluna sofrerá as alterações. O processo de modificação ocorreu a partir da função REPLACE(), a qual tem como objetivo substituir um dado por outro (neste caso, a substituição será feita de uma chave por outra).

Dentro do REPLACE(), passamos como parâmetro coluna::tipo_de_dado, que identifica a coluna onde ocorrerá a modificação e qual será o formato do seu dado. Ademais, é necessário escrever o nome da chave antiga e da chave nova.

Por fim, usamos a expressão ::jsonb, que é usada para converter o resultado da substituição de volta para o tipo jsonb.

Ao levar essa sintaxe para o seu cenário, chegamos nos seguintes scripts SQL:

UPDATE historico
       SET dados = REPLACE(dados::text, 'dataVelha', 'dataAntiga')::jsonb;
UPDATE historico
       SET dados = REPLACE(dados::text, 'dataNew', 'dataNovo')::jsonb;

Os dois UPDATEs acima foram só exemplos. Utilize-os e faça as devidas alterações para alterar o que for necessário em sua tabela!

Maria, espero ter ajudado! Contudo, vale ressaltar que como é um assunto externo aos cursos de PostgreSQL da Alura e que não tenho acesso ao cenário completo do projeto, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema!

Um grande abraço.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!