代码之家  ›  专栏  ›  技术社区  ›  Pavel V.

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

  •  2
  • Pavel V.  · 技术社区  · 10 年前

    我有一个来自函数的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结果,然后一次用一个输入值调用函数,将结果存储在一列中,最后找到最小值-这感觉很笨拙,应该很慢。另一种方法是将我的函数包装在另一个函数中,设置返回和数组参数。但这只是将问题推开:我不知道如何简单地包装它。

    最好的做法是将函数重写为SETOF形式。不过,这是一种变通方法,学习如何调用查询返回的多行的普通函数(如果可能的话)会更好。

    1 回复  |  直到 10 年前
        1
  •  0
  •   Rimas    10 年前

    试试看:

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