Postgresql函数,结果集变为变量

时间:2015-12-12 16:08:19

标签: sql postgresql stored-procedures plpgsql sql-function

我有程序:

CREATE OR REPLACE FUNCTION func()
RETURNS SETOF bigint AS
$BODY$
DECLARE
    rowsQuantity bigint;
BEGIN
    return query select p.id from product p where...;
    GET DIAGNOSTICS rowsQuantity = ROW_COUNT;
    if(rowsQuantity < 8) then
        return query select p.id from product p where p.id not in (ids from prev query) limit 8 - rowsQuantity;
    end if;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

我的问题是,如何从第一个查询中获取id以在第二个查询中使用它们,或者我可以以某种方式声明变量并从第一个查询中选择此变量id,然后在第二个查询中使用此变量? 我无法为我的任务找到解决方案......请帮助我

我使用Postgresql版本9.3.6

  
    

你到底想要做什么?整个功能似乎过于复杂。如果你告诉我们你想要解决的潜在问题,这可能只需要一个查询就可以完成。编辑您的问题根据该数据添加一些示例数据和预期输出。 - a_horse_with_no_name 3分钟前

  

我的程序必须返回8条记录,第一条查询有很多条件(并且由于这个条件,结果集ROW COUNT可能少于8条记录)这就是为什么我需要检查第一次查询的ROW COUNT少于8条记录,i必须从另一个查询添加记录到结果集,但我需要避免重复,第二个查询必须返回0 ... 8行(取决于第一个查询),但没有第一个查询的重复,这就是为什么我需要从第一个查询的ID

  
    

从产品p听到一个简单的选择不同的p.id,其中... limit 8;会做的工作

  

不,第二个查询包含我从第一个查询收到的记录(带有ids), 第二个查询中的DISTINCT没有帮助

1 个答案:

答案 0 :(得分:1)

您可以使用临时表:

begin
    create temp table tt as
        select id 
        from product
        where...
    row_ct = (select count(*) from tt);

    return query select * from tt;

    if row_ct < 8 then
        return query select id 
        from product
        where id not in (select id from tt)
        limit 8 - row_ct;
    end if;
    drop table tt;
end;