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 參數強制為大寫或者小寫。
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,導致小寫的輸出。在位置表示法中,參數只要有默認值就可以從右到左省略。
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)
3. 使用混合表示法
混合表示法結合了位置和名稱表示法。然而,就像之前提到的,命名參數不可以在位置參數前面。例如:
SELECT concat_lower_or_upper('Hello', 'World', uppercase := true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)
在上面的查詢中,參數a和uppercase是用位置聲明的,而 uppercase是用名稱聲明的。在這個例子中,添加了文檔中沒有的一點。在一個有多個參數有默認值的更復雜的函數中,名稱或者混合表示法可以節省很多敲鍵,並且可以減少犯錯的幾率。
注意: 在調用一個聚合函數時,目前不能使用名稱和混合調用表示法(但是當聚合函數用作窗口函數時,它們確實能運行)。
更多知識盡在http://www.infocool.net