支援的版本: 目前 (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 是按名稱指定的。在本範例中,除了文件之外,沒有增加任何內容。對於具有許多具有預設值的參數的更複雜的函數,具名或混合表示法可以節省大量編寫工作並減少出錯的機會。

注意

目前在呼叫聚合函數時無法使用具名和混合呼叫表示法(但當聚合函數用作視窗函數時,它們確實有效)。

提交更正

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