Se você pode atualizar para o Postgresql 9.5, o jsonb_set
comando está disponível, como outros já mencionaram.
Em cada uma das seguintes instruções SQL, omiti a where
cláusula por brevidade; obviamente, você gostaria de adicionar isso de volta.
Nome da atualização:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Substitua as tags (em vez de adicionar ou remover tags):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Substituindo a segunda tag (indexada 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Anexar uma tag ( isso funcionará desde que haja menos de 999 tags; a alteração do argumento 999 para 1000 ou acima gera um erro . Isso não parece mais ser o caso no Postgres 9.5.3; um índice muito maior pode ser usado) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Remova a última tag:
UPDATE test SET data = data #- '{tags,-1}'
Atualização complexa (exclua a última tag, insira uma nova tag e altere o nome):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
É importante observar que em cada um desses exemplos, na verdade, você não está atualizando um único campo dos dados JSON. Em vez disso, você está criando uma versão modificada temporária dos dados e atribuindo essa versão modificada de volta à coluna. Na prática, o resultado deve ser o mesmo, mas manter isso em mente deve tornar as atualizações complexas, como o último exemplo, mais compreensíveis.
No exemplo complexo, há três transformações e três versões temporárias: Primeiro, a última tag é removida. Em seguida, essa versão é transformada adicionando uma nova tag. Em seguida, a segunda versão é transformada alterando o name
campo. O valor na data
coluna é substituído pela versão final.