簡體   English   中英

PostgreSQL:在FROM子句中調用函數不止一次

[英]PostgreSQL: Call a Function More Than Once in FROM Clause

如何在FROM子句中調用一個返回記錄多次的函數? 我了解使用返回記錄的函數時,必須指定“列定義列表”。 但是我該如何使用別名呢?

例:

CREATE OR REPLACE FUNCTION foo(which_foo int) RETURNS SETOF RECORD AS
$BODY$BEGIN
IF which_foo=0 THEN
 RETURN QUERY EXECUTE 'SELECT 1::int,2::int;';
ELSE 
 RETURN QUERY EXECUTE 'SELECT 1::int,2::int;';
END IF;
END$BODY$
LANGUAGE plpgsql;

SELECT * FROM foo(0) AS (a int, b int);;
SELECT * FROM foo(1) AS (c int, d int);
SELECT * FROM foo(0) AS (a int, b int), foo(1) AS (c int, d int);

最后一個選擇語句將失敗,並顯示:

ERROR:  table name "foo" specified more than once

我想繼續使用列定義列表,因為最后要使用的函數必須盡可能通用。

SELECT f0.*, f1.*
FROM
    foo(0) AS f0 (a int, b int),
    foo(1) AS f1 (c int, d int);

我了解使用返回記錄的函數時,必須指定“列定義列表”。

你不可以。 我不會處理匿名記錄。 聲明返回類型 ,因為您已經知道它:

CREATE OR REPLACE FUNCTION foo(which_foo int)
 RETURNS TABLE (a int, b int) AS
$func$
BEGIN
    IF which_foo = 0 THEN
        RETURN QUERY SELECT 1,2;
    ELSE 
        RETURN QUERY SELECT 1,2;
    END IF;
END
$func$ LANGUAGE plpgsql;

並假設您不想將多個調用合並為一行,則應使用UNION ALL

SELECT * FROM foo(0)
UNION ALL
SELECT * FROM foo(1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM