【问题标题】:Updating json array field by removing specific values in Postgres通过删除 Postgres 中的特定值来更新 json 数组字段
【发布时间】:2015-02-23 03:05:34
【问题描述】:

假设我有一个名为SomeTable 的表,主键为row_id,json 数组字段名为some_json

some_json 看起来像这样:

[{'some_key': 'some_value_1'}, {'some_key': 'some_value_2'}, 
 {'some_key': 'some_value_3'}, {'some_key': 'some_value_4'}]

我有一个函数,它接受一个名为 values_to_remove 的文本数组参数,如下所示:

['some_value_2', 'some_value_3', etc]

我想更新some_json,方法是删除所有包含values_to_remove 数组中的文本值的json 对象。我对我需要做什么有一个粗略的想法,但不知道如何用正确的语法将它们拼凑在一起,如果没有意义,请原谅我。

这是我到目前为止所拥有的(请原谅我破坏了语法):

CREATE OR REPLACE FUNCTION remove_json_items (removal_id smallint,        
                                              values_to_remove text[])
RETURNS void AS $$
BEGIN
    UPDATE SomeTable
    SET some_json = array_to_json(array_remove(ARRAY(SELECT * 
                                                     FROM json_array_elements(some_json)), 
                                               (SELECT * 
                                                FROM json_array_elements(some_json), 
                                                     unnest(values_to_remove)
                                                WHERE some_json->>some_key = values_to_remove.value
                                  )))
    WHERE row_id = removal_id;
END;
$$ LANGUAGE plpgsql;

实现此目的的正确解决方案是什么?谢谢。

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    这是用普通 SQL 编写的函数

    CREATE OR REPLACE FUNCTION remove_json_items (removal_id smallint,        
                                                  values_to_remove text[])
    RETURNS void AS $$
        UPDATE sometable
        SET some_json =
           (SELECT json_agg(ae)
            FROM (
                SELECT json_array_elements(some_json) AS ae from sometable WHERE row_id = removal_id
            ) sq1
            WHERE NOT ARRAY[(SELECT * FROM json_to_record(ae) AS x(some_key text))] <@ ARRAY['some_value_3', 'some_value_2'])
            WHERE row_id = removal_id;
    $$ LANGUAGE SQL;
    

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2023-03-28
      • 2019-04-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      相关资源
      最近更新 更多