函數
函數計算
-
在 pg_proc 系統表裡查找準確的匹配。
-
查找最優的匹配
-
產生一個具有相同數量參數的同名函數的列表。
-
如果表刈荿有一個函數,而且該函數的輸入型態可以匹配或轉換則使用之,如果不能,產生一個錯誤。
-
找出所有具有最多顯式參數型態匹配的函數。如果沒有顯式參數匹配的函數則進行下一步。如果只有一個候選函數,而且其參數型態可以匹配或轉換,使用之。
-
如果任何輸入參數型態是"未知"("unknown"), 將輸入的參數分類成布爾( boolean),
數字(numeric), 字符串(string), 幾何(geometric)和用戶定義(user-defined)型態。如果分類後有多於一類,或多於一種用戶定義型態則產生一個錯誤,因為在沒有更多線索的情況下不能導出正確的選擇。如果分類結果只有一類,則將原先的"未知"("unknown")型態轉換成該類的"優選型態"
("preferred type")。
-
挑出型態匹配最準確的函數以及在上一步裡每一類中匹配該類的"優選型態"("preferred
type")的函數。如果這時仍然有多個函數可選,或一個都沒有,則產生一個錯誤。
例子
階乘函數
在 pg_proc 系統表裡只定義了一個階乘函數。所以下面的查詢自動將 int2
參數轉換成 int4:
tgl=> select int4fac(int2 '4');
int4fac
---------
24
(1 row)
實際上它被分析器轉換成:
tgl=> select int4fac(int4(int2 '4'));
int4fac
---------
24
(1 row)
子字串函數
在 pg_proc 裡定義了兩個 substr 函數。但是,其刈荿有一個使用兩個參數,參數型態分別是text
和 int4。
如果其中一個字符串常數的型態不明確,其型態直接與唯一的候選函數匹配:
tgl=> select substr('1234', 3);
substr
--------
34
(1 row)
如果該字符串定義為型態 varchar,就像大多數從表中取來的數據一樣,分析器將試著將其轉換成text:
tgl=> select substr(varchar '1234', 3);
substr
--------
34
(1 row)
被分析器轉換後變成:
tgl=> select substr(text(varchar '1234'), 3);
substr
--------
34
(1 row)
注意:分析器中有一些搜索器用於最佳化 char,varchar,和 text
型態之間的關系。這時,substr 將直接用 varchar
字符串調用,而不是在其中插入一個顯式的型態轉換調用。
而且,如果以 int4 為參數調用函數,分析器將試圖將其轉換成 text:
tgl=> select substr(1234, 3);
substr
--------
34
(1 row)
實際上是這樣執行的
tgl=> select substr(text(1234), 3);
substr
--------
34
(1 row)