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错误。有任何想法吗?
将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)
请注意,该函数是不可变的,请阅读文档中的更多内容。