【问题标题】:Delete attribute from json metadata in postgres (9.4.7)从 postgres (9.4.7) 中的 json 元数据中删除属性
【发布时间】:2026-01-01 14:30:01
【问题描述】:

我有一个表 xyz,它有一个名为 metadata 的 jsob 列,看起来像

"{"decisions": {"final_decision": "ADVANCE"}, "exception": {} }".

我想删除'exception'属性并有一个sql

update xyz set metadata = metadata - metadata->'exception' where process_id='1e3aeac3';

但这在运行时给了我一个例外
错误:运算符不存在:jsonb - jsonb
第 1 行:更新 xyz set metadata= metadata - 'exception'...

提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

我尝试搜索,但无法解决演员表问题。

【问题讨论】:

    标签: sql postgresql postgresql-9.4


    【解决方案1】:

    删除(-)运算符的第二个参数是text.

    如果要删除该属性,请使用它的键:

    update xyz 
    set metadata = metadata - 'exception'
    returning *;
    
                       metadata                   
    ----------------------------------------------
     {"decisions": {"final_decision": "ADVANCE"}}
    (1 row) 
    

    SqlFiddle

    运算符是在 Postgres 9.5 中引入的

    在 Postgres 9.4 中使用函数:

    create function jsonb_remove_key(json_object jsonb, key_to_remove text)
    returns jsonb language sql immutable as $$
        select jsonb_object_agg(key, value)
        from jsonb_each(json_object)
        where key <> key_to_remove
    $$;
    
    update xyz
    set metadata = jsonb_remove_key(metadata, 'exception')
    returning *;
    

    【讨论】:

    • 使用 sql 时出现以下错误:错误:运算符不存在:jsonb - 未知第 1 行:更新 trackable_status 设置元数据 = 元数据 -'异常' ... ^ 提示:无运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
    • 我认为你需要在 postgres 中做一些不同的事情。当我创建相同的示例表 xyz 并运行 pgadmin 中提供的查询时,它给出了与上述相同的错误。
    • 升级 Postgres。您应该在问题中提及您的服务器版本,尤其是它不是最新版本。
    • 现在是 9.4.7。我已经用这个版本更新了我的帖子。这个版本有解决办法吗