如何在PostgreSQL的JSONB数据类型中修改单个属性值?

6 浏览
0 Comments

如何在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有人可以帮助吗?

0
0 Comments

有一些好消息我想要分享。感谢klin,他的建议帮助我发现了这个解决方法。在上面的示例中,如果我简单地使用concat函数,那么我在klin发布的代码中发现的问题就解决了(简而言之,只有当文本值包含空格时才有效)。现在,我可以将单个属性值转换为小写!

UPDATE test1 set info=jsonb_set(info, '{location}', concat('"',lower(info->>'location'),'"')::jsonb, true) returning *;

0
0 Comments

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数据类型中单个属性值的问题以及解决方法。如果你有任何问题,请随时提问。

0