【发布时间】:2016-12-29 16:28:58
【问题描述】:
我在 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
我使用类似结构函数的原因是因为我需要在我的代码中的多个位置计算来自多个表的合并时间范围(自定义类型)。我最好的想法是创建一个可以做到这一点的函数,无论我从哪里获取它,都将所有时间范围用作输入,这样我就不必每次都进行更复杂的查询。
对我缺少什么有什么想法吗?
【问题讨论】:
-
我不清楚您要通过查询实现什么。请edit您的问题并添加一些示例数据和基于该数据的预期输出。 Formatted 文本 请no screen shots
-
这不就是
select int_attribute from my_table where int_attribute > 1吗? -
你的函数需要一个数组。为什么你认为你可以(或应该)给它传递一个简单的整数值?你为什么要这样定义你的函数?
-
我知道示例中的函数不是很有用,很容易用简单的查询替换。我简化了原始函数,使其在 SO 上下文中可读。
-
您将问题简化到不再有意义的程度
标签: sql arrays postgresql plpgsql