PostgreSQL 中没有这样的语法,也没有类似的功能。
您可以在 PL/PgSQL 代码中创建一个临时表,并将其用于所需目的。PL/PgSQL 中的临时表有点烦人,因为名称在会话中是全局的,但它们在 PostgreSQL 8.4 及更高版本中可以正常工作。
当您在单个 SQL 语句中完成所有工作时,一个更好的选择是使用公用表表达式(CTE,或WITH
查询)。这并不适合所有情况。
上面的例子可以通过简单的 PL/PgSQL 更好地解决RETURN QUERY
,但我认为你的真实例子更复杂。
假设这tb_person
是某种生成成本高昂的视图,您不只是想在联合的每个分支中进行扫描,您可以执行以下操作:
CREATE OR REPLACE FUNCTION prc_tst_bulk()
RETURNS TABLE (name text, rowcount integer) AS
$$
BEGIN
RETURN QUERY
WITH v_tb_person AS (SELECT * FROM tb_person)
select name, count(*) from v_tb_person where age > 50
union
select name, count(*) from v_tb_person where gender = 1;
END;
$$ LANGUAGE plpgsql;
这种特殊情况可以进一步简化为一个普通的 SQL 函数:
CREATE OR REPLACE FUNCTION prc_tst_bulk()
RETURNS TABLE (name text, rowcount integer) AS
$$
WITH v_tb_person AS (SELECT * FROM tb_person)
select name, count(*) from v_tb_person where age > 50
union
select name, count(*) from v_tb_person where gender = 1;
$$ LANGUAGE sql;