在自定义函数中将SQL查询用作数组参数(输入)

在自定义函数中将SQL查询用作数组参数(输入),sql,arrays,postgresql,plpgsql,Sql,Arrays,Postgresql,Plpgsql,我在pl/pgsql中创建了一个自定义函数,它的唯一输入是一个数组。我想使用查询的结果作为这个自定义函数的输入,但似乎无法正确获得它。我将使用一个更简单的函数作为示例,也将使用一个比我试图用作输入的查询更简单的查询 功能定义: CREATE OR REPLACE FUNCTION bigger_than_ones(input_array int[]) returns SETOF int AS $$ DECLARE array_item int; BEGIN FOREACH array_i

我在pl/pgsql中创建了一个自定义函数,它的唯一输入是一个数组。我想使用查询的结果作为这个自定义函数的输入,但似乎无法正确获得它。我将使用一个更简单的函数作为示例,也将使用一个比我试图用作输入的查询更简单的查询

功能定义:

CREATE OR REPLACE FUNCTION bigger_than_ones(input_array int[])
returns SETOF int
AS
$$
DECLARE
  array_item int;
BEGIN
  FOREACH array_item in ARRAY input_array
  LOOP
    IF array_item > 1 THEN
      RETURN NEXT array_item;
    END IF;
  END LOOP;
END
$$ LANGUAGE plpgsql;
我有一个表,其中有一列的数据类型与数组数据类型相同。在这种情况下,整数列:

SELECT * FROM my_table;
id | int_attribute
---+--------------
1  | 2
2  | 3
3  | 1
4  | 4
5  | 1
6  | 6
7  | 1
8  | 1
9  | 8
我想使用一个返回该数据类型的列的查询作为函数的输入。我已经尝试过这种方法的一些变体,但没有任何运气:

SELECT * FROM bigger_than_ones(SELECT int_attribute FROM my_table);
返回:

result 
-------------
2
3
4
6
8
我之所以使用结构类似的函数,是因为我需要在代码中的多个位置计算从多个表中得到的合并时间范围(自定义类型)。我最好的想法是创建一个函数来实现这一点,使用所有时间范围作为输入,而不管我从哪里获取它,这样我就不必每次都进行更复杂的查询


您对我缺少的内容有什么想法吗?

您是否尝试过创建自定义类型?有数组和表等集合类型,也有类似于单行记录的对象类型。然后,可以创建此自定义类型的变量用作参数

下面是一个例子:

创建或替换类型namearray作为VARCHAR2(10)的VARRAY(3)


我最终在另一个问题中找到了解决方案:

我可以使用array()操作符,如下所示:

SELECT * FROM bigger_than_ones(ARRAY(SELECT int_attribute FROM my_table));
并得到了预期的输出。

您找到的是一个,它不是运算符(也不是函数),而是一个SQL构造(SQL语法元素)。参考答案使用了错误的术语(现已修复)。差别可能很重要

SELECT * FROM bigger_than_ones(ARRAY(SELECT int_attribute FROM my_table));
您还可以使用basic,它更容易集成到更复杂的查询中,但对于简单的情况,它的集成速度较慢:

SELECT * FROM bigger_than_ones((SELECT array_agg(int_attribute) FROM my_table));
相关的:

我想你知道吗?它可以用来从根本上简化您的测试功能:

CREATE OR REPLACE FUNCTION bigger_than_ones(input_array int[])
  RETURNS SETOF int AS
$func$
   SELECT *
   FROM   unnest(input_array) elem
   WHERE  elem > 1;
$func$  LANGUAGE sql;

此外,对于所有这些,通常都有一种更优越的基于集合的方法。从一个集合构造一个数组只是为了将它传递给一个函数可能是不必要的复杂情况。

我不清楚您试图通过查询实现什么。请回答您的问题,并添加一些示例数据和基于该数据的预期输出。text请问,这不是简单的
从my_表中选择int_属性,其中int_属性>1
?您的函数需要一个数组。为什么您认为您可以(或应该)传递一个简单的整数值?为什么要这样定义函数?我知道示例中的函数不是很有用,很容易用简单的查询替换。我简化了原始函数以使其在如此上下文中可读。您将问题简化到了一个没有任何意义的程度。这对Postgre无效。我不知道
unnest()
看起来非常有用,谢谢。我之所以使用结构类似的函数,是因为我需要在代码中的多个位置计算从多个表中得到的合并时间范围(自定义类型)。我最好的想法是创建一个函数来实现这一点,使用所有时间范围作为输入,而不管我从哪里获取它,这样我就不必每次都进行更复杂的查询。抱歉,如果有什么不清楚的地方,英语不是我的第一语言。@shevia:在你更新之后,问题就清楚了。事实上,比大多数人都清楚。一个大的遗漏:你的博士后版本——应该在每个问题中声明。我只是想提一提可能有更好的方法。也许不是。也许是自定义聚合函数?或者
tstzrange(最小值(下(…))、最大值(上(…))
。您可能想问另一个问题,了解设置和要求的确切细节。