<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 10.3\. 函數 下面講解的過程解釋了如何在一次函數調用中確定所使用的究竟是哪個函數。 **函數類型解析** 1. 從系統表`pg_proc`中選擇要考慮的函數。如果使用了一個不帶模式修飾的函數名字, 那么認為該函數是那些在當前搜索路徑中名字和參數個數都匹配的函數(參閱[Section 5.7.3](#calibre_link-539))。 如果給出一個帶修飾的函數名,那么只考慮指定模式中的函數。 1. 如果搜索路徑中找到了多個相同參數類型的函數,那么只考慮最早出現在路徑中的那一個。 但是不同參數類型的函數將被平等看待,而不管它們在路徑中的位置如何。 2. 如果使用一個`VARIADIC`數組參數聲明一個函數,并且調用時不使用關鍵字`VARIADIC`, 那么該函被認為數組參數被一個或更多它的元素類型的實體代替,并且需要去匹配調用。 經過這樣的擴展,這個函數可能有和非可變函數相同的有效參數類型。在這種情況下, 使用在搜索路徑中出現比較早的函數,或者如果兩個函數在相同的模式中,那么首選非可變的一個。 3. 考慮使用有默認參數值的函數來匹配任何省略了零或者多個默認表參數位置的調用。 如果多個這樣的函數匹配一個調用,那么使用最早出現在搜索路徑中的那個。 如果在非默認位置有兩個或者更多帶有相同模式相同參數類型這樣的函數 (他們的默認參數設置可能有不同),系統將不能確定去選擇哪個, 并且如果不能找到更好的函數匹配調用,那么將會產生一個"ambiguous function call"錯誤。 2. 查找精確接受輸入參數類型的函數。如果找到一個(在一組被考慮的函數中, 可能只存在一個精確匹配的),則用之。包含`unknown`類型的函數調用絕不會在此處找到匹配。 3. 如果沒有找到精確的匹配,則看看函數調用是否需要一個特殊的類型轉換。 如果函數調用只有一個參數并且函數名與某些數據類型的內部名稱相同,那么就會出現這種情況。 另外,該函數的參數必須是一個未知類型的文本,或者與某個已命名數據類型二進制兼容, 或者是一個可以通過請求那種類型的I/O函數轉換為已命名數據類型。(也就是, 要么可以轉換成標準字符串類型,要么可以從標準字符串類型轉換而來。)如果符合這些條件, 那么該函數調用被認為是一種`CAST`聲明。 \[1\] 4. 尋找最優匹配。 1. 拋棄那些輸入類型不匹配并且也不能隱式轉換成匹配的候選函數。`unknown` 文本在這種情況下可以轉換成任何東西。如果只剩下一個候選項,則用之,否則繼續下一步。 2. 遍歷所有候選函數,保留那些輸入類型匹配最準確的。此時, 域被看作和他們的基本類型相同。如果沒有一個函數能準確匹配,則保留所有候選。 如果只剩下一個候選項,則用之,否則繼續下一步。 3. 遍歷所有候選函數,保留那些需要類型轉換時接受(屬于輸入數據類型的類型范疇的) 首選類型位置最多的函數。如果沒有接受首選類型的函數,則保留所有候選。 如果只剩下一個候選項,則用之,否則繼續下一步。 4. 如果有任何輸入參數是`unknown`類型,檢查剩余的候選函數對應參數位置的類型范疇。 在每一個能夠接受字符串類型范疇的位置使用`string`類型(這種對字符串的偏愛是合適的, 因為 unknown 文本確實像字符串)。另外,如果所有剩下的候選函數都接受相同的類型范疇, 則選擇該類型范疇,否則拋出一個錯誤(因為在沒有更多線索的條件下無法作出正確的選擇)。 現在拋棄不接受選定的類型范疇的候選函數,然后,如果任意候選函數在那個范疇接受一個首選類型, 則拋棄那些在該參數位置接受非首選類型的候選函數。如果沒有一個候選符合這些測試則保留所有候選。 如果只有一個候選函數符合,則使用它;否則,繼續下一步。 5. 如果同時有`unknown`和已知類型的參數,并且所有已知類型的參數有相同的類型, 假設`unknown`參數也是這種類型,檢查哪個候選函數可以在`unknown` 參數位置接受這種類型。如果正好一個候選符合,那么使用它。否則,產生一個錯誤。 請注意,"最佳匹配"規則對操作符和對函數的類型分析都是一樣的。下面是一些例子。 **Example 10-5\. 圓整函數參數類型解析** 只有一個`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); ``` **Example 10-6\. 子字符串函數類型解析** 有好幾個`substr`函數,其中一個接受`text` 和`integer`類型。如果用一個未聲明類型的字符串常量調用它, 系統將選擇接受`string`類型范疇的首選類型 (也就是`text`類型)的候選函數。 ``` SELECT substr('1234', 3); substr -------- 34 (1 row) ``` 如果該字符串聲明為`varchar`類型,就像從表中取出來的數據一樣, 分析器將試著將其轉換成`text`類型: ``` SELECT substr(varchar '1234', 3); substr -------- 34 (1 row) ``` 被分析器轉換后實際上變成: ``` SELECT substr(CAST (varchar '1234' AS text), 3); ``` > **Note:** 分析器從`pg_cast`表中了解到`text`和`varchar` 是二進制兼容的,意思是說一個可以傳遞給接受另一個的函數而不需要做任何物理轉換。 因此,在這種情況下,實際上沒有做任何類型轉換。 而且,如果以`integer`為參數調用函數,分析器將試圖將其轉換成`text`類型: ``` SELECT substr(1234, 3); ERROR: function substr(integer, integer) does not exist HINT: No function matches the given name and argument types. You might need to add explicit type casts. ``` 這樣是不行的,因為`integer`不能隱式的轉換為`text`。 需要一個明確的轉換才行: ``` SELECT substr(CAST (1234 AS text), 3); substr -------- 34 (1 row) ``` ### Notes \[1\] 這一步驟的原因是為了支持函數風格的轉換聲明,防止沒有實際轉換函數的情況。 如果有一個轉換函數,它是按照慣例以它的輸出類型命名的,這樣就不需要一個特例。 參閱[CREATE CAST](#calibre_link-556)獲取額外的說明。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看