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

函數

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

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