通过删除Postgres中的特定值来更新json数组字段

时间:2015-02-23 03:05:35

标签: arrays json postgresql

假设我有一个名为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数组中文本值的所有json对象来更新values_to_remove。我粗略地想知道我需要做什么,但不知道如何用正确的语法将它们拼凑起来,所以请原谅我是否有意义。

这是我到目前为止所做的事情(请原谅我对语法的屠杀):

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;

实现这一目标的正确解决方案是什么?感谢。

1 个答案:

答案 0 :(得分:0)

这是使用普通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;