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

符號

轉換程序

符號計算
  1. 在 pg_operator 系統表裡找出準確的匹配。
    1.  
    2. 如果一個雙目符號的一個參數是 unknown。則假設其與另一個參數型態相同。
    3. 掉轉參數,尋找一個做為反向符號匹配時指向自身符號。如果找到,則掉轉分析樹上的參數並使用該符號。
  2. 尋找最優匹配
    1.  
    2. 產生一個同名的符號的列表。
    3. 如果表刈荿有一個符號:如果輸入型態可以匹配或轉換,則使用該符號,否則輸出一個錯誤。
    4. 挑出具有最多顯式的型態匹配的符號。挑出所有沒有顯式的型態匹配的符號並進行下一步。 如果結果只有一個候選符號,而且型態匹配或可轉換。則使用之。
    5. 如果輸入參數是 "unknown", 將輸入按布爾(boolean),數字(numeric),字符串(string),幾何(geometric)或用戶定義(user-defined)分類。如果分類結果有多種型態,或超過一種用戶定義型態,則產生一個錯誤,因為在沒有更多線索的條件下不能導出正確的選擇。如果分類結果只有一類,則將先前"unknown"的型態轉為"優選型態"。
    6. 挑出型態匹配最準確的和從前一步中挑出的匹配各類的"優選型態"的符號。如果還有超過一個的候選符號或是沒有候選符號,則產生一個錯誤。

例子

指數符號

在分類裡只有一個指數符號,它以 float8 作為參數。掃描器給下面查詢表達式的兩個參數賦予int4 的初始型態:
tgl=> select 2 ^ 3 AS "Exp";
 Exp
-----
   8
(1 row)
分析器對兩個參數都做型態轉換,查詢等效於:
tgl=> select float8(2) ^ float8(3) AS "Exp";
 Exp
-----
   8
(1 row)
tgl=> select 2.0 ^ 3.0 AS "Exp";
 Exp
-----
   8
(1 row)
注意:最後的形式最高效,因為不用調用函數做隱含型態轉換。這對小查詢沒有什麼影響,但可能對那些操作大表的查詢的性能產生較大影響。

字符串連接

一種類字符串的語法既可以用於字符串也可以用於複雜的擴展型態。包含不明型態的字串使用可能的候選符號匹配。

有一個未聲明的參數:

tgl=> SELECT text 'abc' || 'def' AS "Text and Unknown";
 Text and Unknown
------------------
 abcdef
(1 row)
本例中分析器尋找一個兩個參數都是 text 的符號。因為有一個這樣的符號,它認為另一個參數的型態是text

聯接未聲明型態:

tgl=> SELECT 'abc' || 'def' AS "Unspecified";
 Unspecified
-------------
 abcdef
(1 row)
本例中對型態的初始值沒有任何暗示,因為查詢中沒有聲明任何型態。因此,分析器查找所有參數都是字符串類的候選符號。並且它選擇"優選型態",text,作為本查詢字符串類的型態。
注意: 如果用戶定義了一個新的數據型態,並且定義了用於該型態的符號“||”,那麼本查詢將不會像上面寫的那樣成功完成。這時分析器會因為現在有兩類候選符號而無法決定使用哪個。

階乘

本例演示了一個有趣的結果。一般來說,階乘只用於整數,Postgres 符號類別刈谻於階乘的只有一個,其以整數為操作數。如果輸入一個非整數數字參數。Postgres 將試圖把該參數轉換成整數進行階乘運算。
tgl=> select (4.3 !);
 ?column?
----------
       24
(1 row)
注意: 這樣做當然會導致一個數學上有疑問的結果,因為非整數的階乘原則沒有定義。但是,資料庫的角色不是數學教學,而是數據操作。如果用戶一定要進行浮點數的階乘,Postgres 將盡可能服從。

上一頁 首頁 下一頁
型態轉換 開頭 函數