如何在 Postgres 中对数组列中的每个数组元素进行舍入?

pez*_*pez 1 sql arrays postgresql

假设我有一个表results,其中包含一score列,该列是一个充满分数的数组:

CREATE TABLE results (
  id serial PRIMARY KEY,
  scores numeric[]
);
Run Code Online (Sandbox Code Playgroud)

我想更新表格,以便将每个分数四舍五入到小数点后 4 位。

我创建了一个round_numeric_array适用于单个数组值的舍入函数:

CREATE OR REPLACE FUNCTION round_numeric_array (numeric[]) RETURNS numeric[]
LANGUAGE SQL
AS $$
   SELECT array_agg(round(unnest($1), 4))
$$;
Run Code Online (Sandbox Code Playgroud)

但如何将其应用于表中的每个值呢?我一直在努力

UPDATE results SET scores = round_numeric_array(scores)
Run Code Online (Sandbox Code Playgroud)

但我得到一个set-valued function called in context that cannot accept a set错误。有任何想法吗?

kli*_*lin 5

unnest()函数放在 FROM 子句中:

CREATE OR REPLACE FUNCTION round_numeric_array (numeric[]) 
RETURNS numeric[]
IMMUTABLE
LANGUAGE SQL 
AS $$
   SELECT array_agg(round(elem, 4))
   FROM unnest($1) as arr(elem);
$$;
Run Code Online (Sandbox Code Playgroud)

请注意,该函数是不可变的,请阅读文档中的更多内容。