我创建了一个返回满足指定条件的所有值的函数,并尝试将
int[]
指定为函数的结果类型。
create or replace function mults_of_3_5(id int) returns int[] language sql as
$$
SELECT ValuesUnder1000
FROM Mults
WHERE (ValuesUnder1000 % 3 = 0) or (ValuesUnder1000 % 5 = 0);
$$;
我收到错误了
ERROR: return type mismatch in function declared to return integer[]
DETAIL: Actual return type is integer.
CONTEXT: sql function "mults_of_3_5"
ValuesUnder1000
的数据类型是integer
。
当我在函数外部使用相同的查询时,会列出满足条件的列中的所有值。
请告诉我如何在 PostgreSQL 中返回数组。
pg_typeof
检查您的数据类型:
select valuesunder1000, pg_typeof(valuesunder1000)
from mults
where (valuesunder1000 % 5 = 0) or (valuesunder1000 % 3 = 0);
你的功能
returns setof int
。如果您希望它返回一个 int[]
数组,则需要组装该数组。 array_agg()
可以帮助
create or replace function mults_of_3_5 (id int) returns int[] as $f$
select array_agg(valuesunder1000)
from mults
where (valuesunder1000 % 5 = 0) or (valuesunder1000 % 3 = 0);
$f$ language sql;
也可以使用
returns table (valuesunder1000 int)
。有关如何构建函数的详细信息,请参阅手册。
您还可以使用设置返回函数(SRF):
CREATE OR REPLACE FUNCTION mults_of_3_5() RETURNS SETOF integer AS $$
BEGIN
RETURN QUERY SELECT ValuesUnder1000
FROM Mults
WHERE (ValuesUnder1000 % 3 = 0) OR (ValuesUnder1000 % 5 = 0);
END;
$$ LANGUAGE plpgsql;
我测试了如下,看起来有效:
CREATE TABLE Mults (ValuesUnder1000 integer);
INSERT INTO Mults (ValuesUnder1000) VALUES (3), (5), (9), (10), (12), (15);
SELECT * FROM mults_of_3_5();