Antes de tudo, gostaria de dizer que não tenho muita experiência, mas comecei a aprender dbs depois de ter algumas matérias relacionadas a dbs na minha universidade (então, lembre-se disso enquanto estiver lendo isso).
Eu já fiz essa pergunta no stackoverflow, mas não obtive uma resposta conclusiva, então pensei que seria uma boa ideia fazer a mesma pergunta aqui, pois este site é focado apenas em bancos de dados e seus prós e contras.
Desejo alterar um único elemento de uma matriz aninhada usando os comandos UPDATE, DELETE ou INSERT. Neste caso, eu queria atualizar um único elemento de um array trocando um dos valores 'lastName' por outro usando o comando UPDATE (a sintaxe que estou usando provavelmente está errada, mas isso é o máximo que consegui descobrir do que eu já li na documentação oficial). Eu usei o dbfiddle para testar se o que estou fazendo funcionaria antes de colocar qualquer coisa no banco de dados real para não cometer erros desnecessários. Aqui está o que escrevi em dbfiddle https://dbfiddle.uk/?rdbms=postgres_10&fiddle=ecc2329efea6af28636b3537d46b6c01
Agradeceria se alguém pudesse esclarecer o que estou fazendo de errado. Se você tiver alguma sugestão sobre como esse tipo de coisa deve ser feito, ficarei mais do que feliz em receber algum feedback construtivo.
Eu não acho que isso pode ser feito usando
jsonb_set()
.O segundo parâmetro para essa função requer um "caminho de destino". Como
podaci
contém uma matriz, você precisa incluir a posição da matriz, por exemplojsonb_set(podaci, '{1,lastName}', '"Kirin"')
- no entanto, não há uma maneira fácil (eu consigo pensar) de obter a posição do índice que você precisa.Portanto, você precisará percorrer os elementos, alterar o que deseja e agregar de volta. Isso pode ser feito com uma subconsulta na atribuição da instrução UPDATE:
jsonb_agg()
agrega os elementos que são retornados dejsonb_array_elements()
volta em uma matriz. A expressão CASE irá então verificar cada elemento e se contiver o nome Maria, o sobrenome será substituído (anexar um valor JSONB a um valor JSONB, substitui as chaves existentes)A cláusula WHERE impede a atualização de linhas que não precisam de atualização
Exemplo on-line
No entanto, seu modelo realmente parece um uso indevido de JSON no banco de dados. Seria mais eficiente armazenar os nomes em uma tabela relacional adequada com um relacionamento um para muitos com a tabela base (
test_tablica1
no seu exemplo)Algo como:
Então a atualização se torna tão simples quanto:
A condição
tablica1_id = 1
é apenas um exemplo. Adicione qualquer condição necessária para restringir a alteração do nome às linhas vinculadas a uma linha específica na tabela pai.