天天看點

PostgreSQL 10.1 手冊_部分 II. SQL 語言_第 4 章 SQL文法_4.3. 調用函數

4.3. 調用函數

4.3.1. 使用位置記号
4.3.2. 使用命名記号
4.3.3. 使用混合記号

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

參數被強制為大寫或小寫形式。這個函數的剩餘細節對這裡并不重要(詳見

第 37 章

)。

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)      

在上述查詢中,參數

a

b

被以位置指定,而

uppercase

通過名字指定。在這個例子中,這隻增加了一點文檔。在一個具有大量帶預設值參數的複雜函數中,命名的或混合的記号法可以節省大量的書寫并且減少出錯的機會。

本文轉自PostgreSQL中文社群,原文連結: