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

運算符號

轉換程序

運算符號評估

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

例子

指數運算符號

在分類裡只有一個指數運算符號,它以 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 將盡可能服從。


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