1. 程式人生 > >PostgreSQL SQL語法(三):呼叫函式

PostgreSQL SQL語法(三):呼叫函式

原文地址

PostgreSQL允許帶有命名引數的函式被使用位置或命名記號法呼叫。命名記號法對於有大量引數的函式特別有用,因為它讓引數和實際引數之間的關聯更明顯和可靠。在位置記號法中,書寫一個函式呼叫時,其引數值要按照它們在函式宣告中被定義的順序書寫。在命名記號法中,引數根據名稱匹配函式引數,並且可以以任何順序書寫。

在任意一種記號法中,在函式宣告中給出了預設值的引數根本不需要在呼叫中寫出。但是這在命名記號法中特別有用,因為任何引數的組合都可以被忽略。而在位置記號法中引數只能從右往左忽略。

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有兩個強制引數,a和b。此外,有一個可選的引數uppercase,其預設值為false。a和b輸入將被串接,並且根據uppercase引數被強制為大寫或小寫形式。這個函式的剩餘細節對這裡並不重要(詳見Chapter 36)。

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,並導致小寫形式的輸出。在位置記號法中,引數可以按照從右往左被忽略並且因此而得到預設值。

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)

3.3. 使用混合記號

混合記號法組合了位置和命名記號法。不過,正如已經提到過的,命名引數不能超越位置引數。例如:

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

在上述查詢中,引數a和b被以位置指定,而uppercase通過名字指定。在這個例子中,這隻增加了一點文件。在一個具有大量帶預設值引數的複雜函式中,命名的或混合的記號法可以節省大量的書寫並且減少出錯的機會。


原文地址