如何在PostgreSQL的JSONB数据类型中修改单个属性值?
如何在PostgreSQL的JSONB数据类型中修改单个属性值?
如何修改PostgreSQL的JSONB数据类型中的单个字段?\n假设我有一个名为animal的表,内容如下:\n
id info ------------------------------------------------------------ 49493 {"habit1":"fly","habit2":"dive","location":"SONOMA NARITE"}
\n我想简单地更改location属性的值(比如转换为大写或小写)。所以在UPDATE之后的结果如下:\n
id info ------------------------------------------------------------ 49493 {"habit1":"fly","habit2":"dive","location":"sonoma narite"}
\n我尝试了下面的方法,但不起作用:\n
update animal set info=jsonb_set(info, '{location}', LOWER(info->>'location'), true) where id='49493'; ---------------------------------- ERROR: function jsonb_set(jsonb, unknown, text, boolean) does not exist LINE 7: update animal set info=jsonb_set(info, '{con... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ********** Error ********** ERROR: function jsonb_set(jsonb, unknown, text, boolean) does not exist
\n如果我只知道要更新的值,那么可以直接使用以下方法:\n
update animal set info=jsonb_set(info, '{location}', '"sonoma narite"', true) where id='49493';
\n然而,如果文本值是未知的,并且我们只想进行一些简单的操作,如追加、前置、大小写转换,我无法找到一个简单的答案。\n我对jsonb set函数没有提供如此琐碎的操作感到惊讶,它只是尝试更新jsonb中的文本属性的大小写而已。\n有人可以帮助吗?
PostgreSQL中的JSONB数据类型允许我们存储和操作JSON数据。然而,在某些情况下,我们可能需要修改JSONB数据类型中的单个属性值。下面是一个关于如何修改JSONB数据类型中单个属性值的问题以及解决方法。
问题的出现原因是,在使用jsonb_set()函数时,第三个参数应该是jsonb类型的。问题在于将文本字符串转换为jsonb字符串时,需要使用双引号括起来的字符串。我们可以使用concat()或format()函数来实现。
解决方法如下:
update animal set info = jsonb_set(info, '{location}', concat('"', lower(info->>'location'), '"')::jsonb, true) -- jsonb_set(info, '{location}', format('"%s"', lower(info->>'location'))::jsonb, true) where id='49493' returning *;
在PostgreSQL 9.4中,我们可以使用jsonb_each_text()函数将json列展开,对键和值进行聚合并在处理过程中修改指定的值,最后构建一个json对象。
update animal a set info = u.info from ( select id, json_object( array_agg(key), array_agg( case key when 'location' then lower(value) else value end))::jsonb as info from animal, lateral jsonb_each_text(info) group by 1 ) u where u.id = a.id and a.id = 49493;
如果可以创建函数,这个解决方案可能更加方便:
create or replace function update_info(info jsonb) returns jsonb language sql as $$ select json_object( array_agg(key), array_agg( case key when 'location' then lower(value) else value end))::jsonb from jsonb_each_text(info) $$ update animal set info = update_info(info) where id = 49493;
以上就是关于如何修改PostgreSQL JSONB数据类型中单个属性值的问题以及解决方法。如果你有任何问题,请随时提问。