PostgreSQL
上一頁 第六章. 型態轉換 下一頁

函數

函數評估

  1. 在 pg_proc 系統表裡查找準確的匹配。
  2. 查找最優的匹配
    1. 產生一個具有相同數量參數的同名函數的列表。
    2. 如果表刈荿有一個函數,而且該函數的輸入型態可以匹配或轉換則使用之,如果不能,產生一個錯誤。
    3. 找出所有具有最多顯式參數型態匹配的函數。如果沒有顯式參數匹配的函數則進行下一步。如果只有一個候選函數,而且其參數型態可以匹配或轉換,使用之。
    4. 如果任何輸入參數型態是"未知"("unknown"), 將輸入的參數分類成布爾( boolean), 數字(numeric), 字符串(string), 幾何(geometric)和用戶定義(user-defined)型態。如果分類後有多於一類,或多於一種用戶定義型態則產生一個錯誤,因為在沒有更多線索的情況下不能導出正確的選擇。如果分類結果只有一類,則將原先的"未知"("unknown")型態轉換成該類的"優選型態" ("preferred type")。
    5. 挑出型態匹配最準確的函數以及在上一步裡每一類中匹配該類的"優選型態"("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)

注意:分析器中有一些搜索器用於最佳化 charvarchar, 和 text 型態之間的關系。這時,substr 將直接用 varchar 字符串調用,而不是在其中插入一個顯式的型態轉換調用。

而且,如果以 int4 為參數調用函數,分析器將試圖將其轉換成 text

tgl=> select substr(1234, 3);
substr
------
    34
(1 row)

實際上是這樣執行的

tgl=> select substr(text(1234), 3);
substr
------
    34
(1 row)

上一頁 首頁 下一頁
運算符號 開頭 查詢目標