PostgreSQL 調(diào)用函數(shù)

2021-08-26 09:45 更新
4.3.1. 使用位置記號
4.3.2. 使用命名記號
4.3.3. 使用混合記號

PostgreSQL允許帶有命名參數(shù)的函數(shù)被使用位置命名記號法調(diào)用。命名記號法對于有大量參數(shù)的函數(shù)特別有用,因為它讓參數(shù)和實際參數(shù)之間的關(guān)聯(lián)更明顯和可靠。在位置記號法中,書寫一個函數(shù)調(diào)用時,其參數(shù)值要按照它們在函數(shù)聲明中被定義的順序書寫。在命名記號法中,參數(shù)根據(jù)名稱匹配函數(shù)參數(shù),并且可以以任何順序書寫。對于每一種記法,還要考慮函數(shù)參數(shù)類型的效果,這些在第 10.3 節(jié)有介紹。

在任意一種記號法中,在函數(shù)聲明中給出了默認值的參數(shù)根本不需要在調(diào)用中寫出。但是這在命名記號法中特別有用,因為任何參數(shù)的組合都可以被忽略。而在位置記號法中參數(shù)只能從右往左忽略。

PostgreSQL也支持混合記號法,它組合了位置和命名記號法。在這種情況中,位置參數(shù)被首先寫出并且命名參數(shù)出現(xiàn)在其后。

下列例子將展示所有三種記號法的用法:

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;

函數(shù)concat_lower_or_upper有兩個強制參數(shù),ab。此外,有一個可選的參數(shù)uppercase,其默認值為false。ab輸入將被串接,并且根據(jù)uppercase參數(shù)被強制為大寫或小寫形式。這個函數(shù)的剩余細節(jié)對這里并不重要(詳見第 37 章)。

4.3.1. 使用位置記號

PostgreSQL中,位置記號法是給函數(shù)傳遞參數(shù)的傳統(tǒng)機制。一個例子:

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

所有參數(shù)被按照順序指定。結(jié)果是大寫形式,因為uppercase被指定為true。另一個例子:

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

這里,uppercase參數(shù)被忽略,因此它接收它的默認值false,并導(dǎo)致小寫形式的輸出。在位置記號法中,參數(shù)可以按照從右往左被忽略并且因此而得到默認值。

4.3.2. 使用命名記號

在命名記號法中,每一個參數(shù)名都用=> 指定來把它與參數(shù)表達式分隔開。例如:

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

再次,參數(shù)uppercase被忽略,因此它被隱式地設(shè)置為false。使用命名記號法的一個優(yōu)點是參數(shù)可以用任何順序指定,例如:

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. 使用混合記號

混合記號法組合了位置和命名記號法。不過,正如已經(jīng)提到過的,命名參數(shù)不能超越位置參數(shù)。例如:

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

在上述查詢中,參數(shù)ab被以位置指定,而uppercase通過名字指定。在這個例子中,這只增加了一點文檔。在一個具有大量帶默認值參數(shù)的復(fù)雜函數(shù)中,命名的或混合的記號法可以節(jié)省大量的書寫并且減少出錯的機會。

注意

命名的和混合的調(diào)用記號法當(dāng)前不能在調(diào)用聚集函數(shù)時使用(但是當(dāng)聚集函數(shù)被用作窗口函數(shù)時它們可以被使用)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號