乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      OushuDB 用戶指南類型轉換之函數

       北漂二號 2021-12-23

      在一次函數調用中使用的特定函數由以下幾個步驟決定。

      函數類型解析

      1. 從系統(tǒng)表pg_proc中選擇要考慮的函數。如果使用了一個不帶模式修飾的函數名字, 那么認為該函數是那些在當前搜索路徑中名字和參數個數都匹配的函數(參閱 模式搜索路徑 )。 如果給出一個帶修飾的函數名,那么只考慮指定模式中的函數。

        1. 如果搜索路徑中找到了多個相同參數類型的函數,那么只考慮最早出現在路徑中的那一個。 但是不同參數類型的函數將被平等看待,而不管它們在路徑中的位置如何。

      2. 查找精確接受輸入參數類型的函數。如果找到一個(在一組被考慮的函數中, 可能只存在一個精確匹配的),則用之。包含unknown類型的函數調用絕不會在此處找到匹配。

      3. 如果沒有找到精確的匹配,則看看函數調用是否需要一個特殊的類型轉換。 如果函數調用只有一個參數并且函數名與某些數據類型的內部名稱相同,那么就會出現這種情況。另外,該函數的參數必須是一個未知類型的文本,或者與某個已命名數據類型二進制兼容。當這些條件滿足時,函數參數可以在沒有任何實際函數調用的時候轉換為已命名的數據類型。

      4. 查找最佳匹配。

      a. 拋棄那些輸入類型不匹配并且也不能隱式轉換成匹配的候選函數。unknown 文本在這種情況下可以轉換成任何東西。如果只剩下一個候選項,則用之,否則繼續(xù)下一步。

      b. 遍歷所有候選函數,保留那些輸入類型匹配最準確的。此時, 域被看作和他們的基本類型相同。如果沒有一個函數能準確匹配,則保留所有候選。 如果只剩下一個候選項,則用之,否則繼續(xù)下一步。

      c. 遍歷所有候選函數,保留那些需要類型轉換時接受(屬于輸入數據類型的類型范疇的) 首選類型位置最多的函數。如果沒有接受首選類型的函數,則保留所有候選。 如果只剩下一個候選項,則用之,否則繼續(xù)下一步。

      d. 如果有任何輸入參數是unknown類型,檢查剩余的候選函數對應參數位置的類型范疇。 在每一個能夠接受字符串類型范疇的位置使用string類型(這種對字符串的偏愛是合適的, 因為 unknown 文本確實像字符串)。另外,如果所有剩下的候選函數都接受相同的類型范疇, 則選擇該類型范疇,否則拋出一個錯誤(因為在沒有更多線索的條件下無法作出正確的選擇)。 現在拋棄不接受選定的類型范疇的候選函數,然后,如果任意候選函數在那個范疇接受一個首選類型, 則拋棄那些在該參數位置接受非首選類型的候選函數。

      1. 如果正好一個候選符合,那么使用它。否則,產生一個錯誤。

      請注意,”最佳匹配”規(guī)則對操作符和對函數的類型分析都是一樣的。下面是一些例子。

      例.圓整函數參數類型解析

      只有一個round函數有兩個參數(第一個是numeric, 第二個是integer)。所以下面的查詢自動把第一個類型為integer 的參數轉換成numeric類型:

      SELECT round(4, 4);round--------4.0000(1 row)

      實際上它被分析器轉換成:

      SELECT round(CAST (4 AS numeric), 4);

      因為帶小數點的數值常量初始時被賦予numeric類型, 因此下面的查詢將不需要類型轉換,并且可能會略微高效一些:

      SELECT round(4.0, 4);

      例.子字符串函數類型解析

      有好幾個substr函數,其中一個接受text 和integer類型。如果用一個未聲明類型的字符串常量調用它, 系統(tǒng)將選擇接受string類型范疇的首選類型 (也就是text類型)的候選函數。

      SELECT substr('1234', 3);substr--------34(1 row)

      如果該字符串聲明為varchar類型,就像從表中取出來的數據一樣, 分析器將試著將其轉換成text類型:

      SELECT substr(varchar '1234', 3);substr--------34(1 row)

      Note

      分析器從pg_cast表中了解到text和varchar 是二進制兼容的,意思是說一個可以傳遞給接受另一個的函數而不需要做任何物理轉換。 因此,在這種情況下,實際上沒有做任何類型轉換。

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

      SELECT substr(1234, 3);substr--------34(1 row)

      事實上變成:

      SELECT substr(CAST (1234 AS text), 3);

      這種自動轉換可行是因為有一個從integer 到text 的隱式轉換。

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多