如何在Postgres 9.4中对JSONB类型的列执行更新操作

通过查看Postgres9.4数据类型JSONB的文档,我并不清楚如何对JSONB列进行更新

JSONB类型和功能的文档:

http://www.postgresql.org/docs/9.4/static/functions-json.html
http://www.postgresql.org/docs/9.4/static/datatype-json.html

作为示例,我有以下基本表结构:

创建表测试(id序列,数据jsonb);

插入很容易,如:

插入测试(数据)值(“{”名称“:“我的名字”,“标记“:[“tag1”,“tag2”]}”);

现在,我如何更新“数据”列?这是无效的语法:

更新测试集数据->'名称“=”我的其他名称“,其中id=1;

这是不是记录了我错过的某个明显的地方?谢谢

如果您能够升级到Postgresql 9.5,则可以使用jsonb_set命令,正如其他人所提到的

在下面的每个SQL语句中,为了简洁起见,我省略了where子句;很明显,你会想把它加回去

更新名称:

更新测试集数据=jsonb_集(数据,{name},”my other name’);

更换标签(与添加或删除标签相反):

更新测试集数据=jsonb_集(数据,{tags},'[“tag3”,“tag4”]);

替换第二个标记(0索引):

更新测试集数据=jsonb_集(数据,{tags,1}’,tag5’);

追加一个标记(,只要标记少于999个,这将起作用;将参数999更改为1000或更高会产生错误。。Postgres 9.5.3中不再出现这种情况;可以使用更大的索引):

更新测试集数据=jsonb_集(数据,{tags,999999999},'tag6',true);

删除最后一个标记:

更新测试集数据=数据#-'{tags,-1}'

复杂更新(删除最后一个标记,插入新标记,并更改名称):

更新测试集数据=jsonb\u集(
jsonb_集(数据#-'{tags,-1}','{tags,99999999}',''tag3',true),
"{name},"我的另一个名字";;

需要注意的是,在这些示例中,实际上并没有更新JSON数据的单个字段。相反,您将创建一个临时的、修改过的数据版本,并将该修改过的版本分配回列。在实践中,结果应该是相同的,但记住这一点应该使复杂的更新(如上一个示例)更容易理解

在这个复杂的示例中,有三个转换和三个临时版本:首先,删除最后一个标记。然后,通过添加新标记来转换该版本。接下来,通过更改名称字段来转换第二个版本。数据列中的值将替换为最终版本

发表评论