假设我有一个名为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;
实现这一目标的正确解决方案是什么?感谢。
答案 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;