PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como realizar operações de atualização em colunas do tipo JSONB no Postgres 9.4


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 (isso funcionará enquanto houver menos de 999 tags; alterar o argumento 999 para 1000 ou superior 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 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.