如何在返回整数[]的SQL函数中使用返回整数的查询?

问题描述 投票:0回答:2

我创建了一个返回满足指定条件的所有值的函数,并尝试将

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 中返回数组。

postgresql sqldatatypes sql-function
2个回答
3
投票

使用

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)
。有关如何构建函数的详细信息,请参阅手册


1
投票

您还可以使用设置返回函数(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();
© www.soinside.com 2019 - 2024. All rights reserved.