Se você conseguir atualizar para o Postgresql 9.5, o
jsonb_set
comando está disponível, como outros já mencionaram. Em cada uma das instruções SQL a seguir, omiti o
where
cláusula de 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 oposição a adicionar ou remover tags):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Substituindo a segunda tag (indexada em 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Anexar uma tag (
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Remova a última etiqueta:
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, você não está realmente 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 nos data
coluna é substituída pela versão final.