【问题标题】:How to remove all JSON attributes with certain value in PostgreSQL如何在 PostgreSQL 中删除所有具有特定值的 JSON 属性
【发布时间】:2021-11-10 06:42:30
【问题描述】:

给定这张表

parent payload
1 { a: 7, b: 3 }
2 { a: 7, c: 3 }
1 { d: 3, e: 1, f: 3 }

我想更新1 的子级并删除X 的任何属性,其中payload->X3

执行查询后,记录应如下所示:

parent payload
1 { a: 7 }
2 { a: 7, c: 3 }
1 { e: 1 }
    update records set payload=?? where parent = 1 and ??

【问题讨论】:

    标签: sql postgresql jsonb


    【解决方案1】:

    没有内置的函数,但你可以自己写:

    create function remove_keys_by_value(p_input jsonb, p_value jsonb)
      returns jsonb
    as
    $$
      select jsonb_object_agg(t.key, t.value)
      from jsonb_each(p_input) as t(key, value)
      where value <> p_value;
    $$
    language sql
    immutable;
    

    那么你可以这样做:

    update records
      set payload = remove_key_by_value(payload, to_jsonb(3))
    where parent = 1;
    

    这假设payload 被定义为jsonb(它应该是)。如果不是,你必须投它:payload::jsonb

    【讨论】:

    • 您可能已经注意到,原本优雅的函数中的一个小错误。它实际上删除了除了现在的值之外的所有内容。将 where 子句替换为 where value != p_value;
    【解决方案2】:

    试试这个

    update records
    set payload = payload - 'x'
    where parent = 1 and payload->>'x'::int = 3
    

    【讨论】:

    • x 可以是任何东西,我无法为所有可能的键编写查询。但是谢谢,这可能对其他人有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2020-12-06
    • 2020-09-25
    • 2015-11-28
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多