使用都汇集功能UPDATE JSON数组(UPDATE json array using aggre

2019-10-21 23:36发布

在Postgres 9.3,Python 2.7版,psycopg2工作。
我有一个名为表SomeTable用JSON场some_json_arrayrow_id关键。

some_json_array看起来是这样的:

"[{'key': 'value_one'}, {'key': 'value_two'}, etc]"

我也有,我正在尝试添加一些元素的JSON数组的函数SomeTable对应于给定row_id

我的代码如下:

CREATE OR REPLACE FUNCTION add_elements (insertion_id smallint, new_elements_json json)
RETURNS void AS $$
BEGIN
    UPDATE SomeTable
    SET some_json_array = (SELECT array_to_json(array_agg(some_json_array) || array_agg(new_elements_json)))
    WHERE row_id = insertion_id;
END;
$$ LANGUAGE plpgsql;

我得到以下错误:

Cannot use aggregate function in UPDATE

我相信在抱怨array_agg()

我将如何修改这个功能,使其工作? 我能坚持的WHERE子句为SELECT如果有必要声明。

Answer 1:

聚合函数不能用于象普通的功能,只有在聚合上下文。

因为Postgres不能直接操纵JSON数组(它只是一个有效的json 的Postgres,而不是一个数组),你必须......

  • 无论是投的json值到text ,串联了新的元素,生成有效的JSON语法和转换回来,
  • 或变换的一个Postgres阵列jsonjson[]追加新元素和变换这个Postgres的阵列回json值。
    array_to_json()是足够聪明,不编码json Postgres的阵列的另一时间的元件。

第一种方法是更容易出错。 你将不得不用手建立有效的JSON。 这里是第二个变体的实现:

CREATE OR REPLACE FUNCTION add_elements (_id int2, _elem json)
  RETURNS void AS
$func$
BEGIN
    UPDATE SomeTable s
    SET    some_json_array = array_to_json(ARRAY(
              SELECT * FROM json_array_elements(s.some_json_array)
              UNION  ALL SELECT _elem
              ))
    WHERE  s.row_id = _id;
END
$func$ LANGUAGE plpgsql;

该函数包装主要是风马牛不相及的问题。 可能仅仅是一个简单的SQL语句。

有关:

  • 如何把JSON数组Postgres的阵列?


文章来源: UPDATE json array using aggregrate function