如果您能够升级到Postgresql 9.5,则该jsonb_set命令可用,就像其他人提到的那样。
在下面的每个SQL语句中,where为了简洁起见,我都省略了该子句。显然,您想要添加回去。
更新名称:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
替换标签(与添加或删除标签相反):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
替换第二个标签(0索引):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
附加标签(只要少于999个标签就可以使用;将参数999更改为1000或以上会产生错误。在Postgres 9.5.3中似乎不再是这种情况;可以使用更大的索引) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
删除最后一个标签:
UPDATE test SET data = data #- '{tags,-1}'
复杂的更新(删除最后一个标签,插入一个新标签,然后更改名称):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
重要的是要注意,在每个示例中,您实际上都没有更新JSON数据的单个字段。相反,您正在创建数据的临时修改版本,并将该修改版本分配回该列。实际上,结果应该是相同的,但是牢记这一点应该使复杂的更新(如最后一个示例)更容易理解。
在复杂的示例中,存在三个转换和三个临时版本:首先,删除最后一个标记。然后,通过添加新标签来转换该版本。接下来,通过更改name字段来转换第二个版本。data列中的值将替换为最终版本。