将多行(查询结果)传递给函数

时间:2014-09-05 06:51:08

标签: sql postgresql postgresql-9.3

我从一个函数中获取SELECT(使用普通,而不是SETOF参数)。但是,我想在查询中多次调用该函数(然后聚合结果),用CTE提供它。

一些(示例)代码:

CREATE TYPE MY_TYPE AS ( a integer, b integer );

CREATE OR REPLACE FUNCTION foo( foobar INTEGER ) 
RETURNS MY_TYPE AS $$
BEGIN
  -- do something, return MY_TYPE
END;  
$$ LANGUAGE plpgsql;

WITH x AS (
  SELECT a FROM bar WHERE b = 1
)
SELECT min(a) FROM foo( (SELECT a FROM x) ) f

这不起作用,我收到以下错误消息:

ERROR:  more than one row returned by a subquery used as an expression

现在我想知道如何重写查询。我可以循环CTE结果,然后一次调用一个输入值的函数,将结果存储在一列中,最后找到最小值 - 这感觉很笨拙,应该很慢。另一种方法是将我的函数包装在另一个函数中,set-returns和array参数。但这只是推动了问题:我不知道如何简单地包装它。

将函数重写为SETOF表单似乎没什么问题。不过,这是一种解决方法,并且学习如何调用查询返回的多行(如果可能)的普通函数会更好。

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT min(f.a)
  FROM bar  
  CROSS JOIN foo(bar.a) f
  WHERE bar.b = 1