在连接查询中使用 PLPGSQL 函数结果

Using PLPGSQL function result in a join query

我正在开发一个应用程序,它的数据库是 Postgres 9.5 我有以下 plpgsql 函数

 CREATE OR REPLACE FUNCTION public.getall_available_products(
     IN start_day_id integer,
     IN end_day_id integer)
       RETURNS TABLE(id integer) AS
  $BODY$
  SELECT product_id As id
       FROM   product_days
       WHERE  available > 0
        AND    days_id BETWEEN start_day_id AND end_day_id         
$BODY$
LANGUAGE sql VOLATILE

我需要在另一个 plpgsqljoin 查询中使用上述函数的结果 函数

 CREATE OR REPLACE FUNCTION public.get_available_product_details(
    IN start_day_id integer,
    IN end_day_id integer)
     RETURNS SETOF record AS
 $BODY$declare
 begin    
    SELECT pd.days_id As pd_days_id, pd.id AS p_id, pd.name AS p_name
   FROM  product p JOIN product_days pd   
     Using(id)
     WHERE  pd.id in 
     Select * from 
      //here I need to use the result of the getall_available_products 
      //function
  end;         
 $BODY$
 LANGUAGE plpgsql VOLATILE

在第二个函数中应该如何使用第一个函数的结果?我用评论指定的地方。

您可以 select 从集合 / table 返回 table 等函数或视图。你的情况:

SELECT pd.days_id As pd_days_id, pd.id AS p_id, pd.name AS p_name
FROM  product p JOIN product_days pd USING(id)
WHERE  pd.id IN
    (SELECT a.id FROM public.getall_available_products(start_day_id, end_day_id) a);

您甚至可以加入功能:

SELECT pd.days_id As pd_days_id, pd.id AS p_id, pd.name AS p_name
FROM  product p JOIN product_days pd USING(id) 
    JOIN public.getall_available_products(start_day_id, end_day_id) a ON pd.id = a.id;

这应该会给出相同的结果。

注意:如果您想将列值作为函数参数传递,您应该查看相对较新的关键字 LATERAL