2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

4.3. 呼叫函式 #

PostgreSQL 允許具有命名引數的函式使用位置命名表示法來呼叫。命名錶示法對於具有大量引數的函式特別有用,因為它使引數與實際引數之間的關聯更加明確和可靠。在位置表示法中,函式呼叫按照其宣告中的引數定義順序編寫其引數值。在命名錶示法中,引數透過名稱與函式引數匹配,並且可以按任意順序編寫。對於每種表示法,還要考慮函式引數型別的影響,這在第 10.3 節中有說明。

在這兩種表示法中,在函式宣告中已給出預設值的引數可以在呼叫時完全省略。但這在命名錶示法中尤其有用,因為可以省略任何引數的組合;而在位置表示法中,引數只能從右到左省略。

PostgreSQL 還支援混合表示法,該表示法結合了位置表示法和命名錶示法。在這種情況下,位置引數先寫,命名引數後出現。

以下示例將說明所有三種表示法的用法,使用以下函式定義:

CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)
RETURNS text
AS
$$
 SELECT CASE
        WHEN $3 THEN UPPER($1 || ' ' || $2)
        ELSE LOWER($1 || ' ' || $2)
        END;
$$
LANGUAGE SQL IMMUTABLE STRICT;

函式 concat_lower_or_upper 有兩個必需引數 ab。此外,還有一個可選引數 uppercase,其預設值為 falseab 的輸入將連線起來,並根據 uppercase 引數強制轉換為大寫或小寫。此函式定義的其餘詳細資訊在此處不重要(有關更多資訊,請參閱第 36 章)。

4.3.1. 使用位置表示法 #

位置表示法是 PostgreSQL 中向函式傳遞引數的傳統機制。示例如下:

SELECT concat_lower_or_upper('Hello', 'World', true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

所有引數都按順序指定。結果是大寫,因為 uppercase 指定為 true。另一個示例是:

SELECT concat_lower_or_upper('Hello', 'World');
 concat_lower_or_upper
-----------------------
 hello world
(1 row)

在此,uppercase 引數被省略,因此它接收其預設值 false,從而導致小寫輸出。在位置表示法中,只要引數有預設值,就可以從右到左省略引數。

4.3.2. 使用命名錶示法 #

在命名錶示法中,使用 => 指定每個引數的名稱,以將其與引數表示式分隔開。例如:

SELECT concat_lower_or_upper(a => 'Hello', b => 'World');
 concat_lower_or_upper
-----------------------
 hello world
(1 row)

同樣,uppercase 引數被省略,因此它隱式設定為 false。使用命名錶示法的一個優點是引數可以按任意順序指定,例如:

SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World');
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

為了向後相容,支援基於“:=”的舊語法

SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

4.3.3. 使用混合表示法 #

混合表示法結合了位置表示法和命名錶示法。但是,如前所述,命名引數不能出現在位置引數之前。例如:

SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

在上面的查詢中,引數 ab 是透過位置指定的,而 uppercase 是透過名稱指定的。在此示例中,這除了文件記錄外,幾乎沒有其他作用。對於具有許多具有預設值的引數的更復雜的函式,命名或混合表示法可以節省大量的書寫工作,並減少出錯的可能性。

注意

命名和混合呼叫表示法目前不能用於呼叫聚合函式(但當聚合函式用作視窗函式時,它們可以工作)。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步說明的內容,請使用此表格報告文件問題。