<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 10.2\. 操作符 下面講解的過程解釋了操作符表達式如何確定引用哪個操作符。 請注意這個過程受被調用操作符的優先級影響,因為這將決定哪個子表達式被用來作為操作符的輸入。 參閱[Section 4.1.6](#calibre_link-538)獲取更多信息。 **操作符類型解析** 1. 從系統表`pg_operator`中選出要考慮的操作符。 如果使用了一個不帶模式修飾的操作符名(常見的狀況), 那么認為該操作符是那些在當前搜索路徑中名字和參數個數都匹配的操作符 (參閱[Section 5.7.3](#calibre_link-539))。如果給出一個帶修飾的操作符名, 那么只考慮指定模式中的操作符。 1. 如果搜索路徑中找到了多個相同參數類型的操作符,那么只考慮最早出現在路徑中的那一個。 但是不同參數類型的操作符將被平等看待,而不管它們在路徑中的位置如何。 2. 查找精確接受輸入參數類型的操作符。如果找到一個(在一組被考慮的操作符中, 可能只存在一個精確匹配的),則用之。 1. 如果一個雙目操作符調用中的一個參數是`unknown`類型, 則在本次檢查中假設其與另一個參數類型相同。包括兩個`unknown` 輸入的調用或一個一元帶有`unknown`輸入的操作符,將絕不會在此處找到匹配。 3. 尋找最優匹配。 1. 拋棄那些輸入類型不匹配并且也不能隱式轉換成匹配的候選操作符。 `unknown`文本在這種情況下可以轉換成任何東西。 如果只剩下一個候選項,則用之,否則繼續下一步。 2. 遍歷所有候選操作符,保留那些輸入類型匹配最準確的。此時,域被看作和他們的基本類型相同。 如果沒有一個操作符能被保留,則保留所有候選。如果只剩下一個候選項,則用之,否則繼續下一步。 3. 遍歷所有候選操作符,保留那些需要類型轉換時接受(屬于輸入數據類型的類型范疇的)首選類型位置最多的操作符。 如果沒有接受首選類型的操作符,則保留所有候選。如果只剩下一個候選項,則用之,否則繼續下一步。 4. 如果有任何輸入參數是`unknown`類型,檢查剩余的候選操作符對應參數位置的類型范疇。 在每一個能夠接受字符串類型范疇的位置使用 `string`類型(這種對字符串的偏愛是合適的, 因為 unknown 文本確實像字符串)。另外,如果所有剩下的候選操作符都接受相同的類型范疇, 則選擇該類型范疇,否則拋出一個錯誤(因為在沒有更多線索的條件下無法作出正確的選擇)。 現在拋棄不接受選定的類型范疇的候選操作符,然后, 如果任意候選操作符在某個給定的參數位置接受一個首選類型, 則拋棄那些在該參數位置接受非首選類型的候選操作符。 如果沒有一個操作符能被保留,則保留所有候選。如果只剩下一個候選項,則用之,否則繼續下一步。 5. 如果同時有`unknown`和已知類型的參數,并且所有已知類型的參數都是相同的類型, 那么假設`unknown`參數也是那種類型,并檢查哪個候選操作符在`unknown` 參數位置接受那個類型。如果只有一個操作符符合,那么使用它。否則,產生一個錯誤。 下面是一些例子。 **Example 10-1\. 階乘操作符類型解析** 在系統表中里只有一個階乘操作符(后綴`!`),它以`bigint`作為參數。 掃描器給下面查詢表達式的參數賦予`integer`的初始類型: ``` SELECT 40 ! AS "40 factorial"; 40 factorial -------------------------------------------------- 815915283247897734345611269596115894272000000000 (1 row) ``` 分析器對參數做類型轉換,查詢等效于: ``` SELECT CAST(40 AS bigint) ! AS "40 factorial"; ``` **Example 10-2\. 字符串連接操作符類型分析** 一種字符串風格的語法既可以用于字符串也可以用于復雜的擴展類型。 未聲明類型的字符串將被所有可能的候選操作符匹配。 有一個未聲明的參數的例子: ``` SELECT text 'abc' || 'def' AS "text and unknown"; text and unknown ------------------ abcdef (1 row) ``` 本例中分析器尋找兩個參數都是`text`的操作符。確實這樣的操作符, 因此另一個參數就被認為是`text`類型。 下面是連接兩個未聲明類型的值: ``` SELECT 'abc' || 'def' AS "unspecified"; unspecified ------------- abcdef (1 row) ``` 因為查詢中沒有聲明任何類型,所以本例中對類型沒有任何初始提示。因此, 分析器查找所有候選操作符,發現既存在接受字符串類型范疇的操作符也存在接受位串類型范疇的操作符。 因為字符串類型范疇是首選,所以選擇字符串類型范疇的首選類型`text` 作為解析未知類型文本的聲明類型。 **Example 10-3\. 絕對值和取反操作符類型分析** PostgreSQL操作符表里面有幾條記錄對應于前綴操作符`@`, 它們都用于為各種數值類型實現絕對值操作。其中之一用于`float8`類型, 它是數值類型范疇中的首選類型。因此,在面對`unknown`輸入的時候, PostgreSQL會使用該類型: ``` SELECT @ '-4.5' AS "abs"; abs ----- 4.5 (1 row) ``` 此處,系統在應用選定的操作符之前隱式的轉換unknown類型的文字為`float8`類型。 我們可以驗證它是`float8`而不是其它類型: ``` SELECT @ '-4.5e500' AS "abs"; ERROR: "-4.5e500" is out of range for type double precision ``` 另一方面,前綴操作符`~`(按位取反)只為整數數據類型定義, 而不為`float8`定義。因此,如果我們用`~`做類似的實驗將得到: ``` SELECT ~ '20' AS "negation"; ERROR: operator is not unique: ~ "unknown" HINT: Could not choose a best candidate operator. You might need to add explicit type casts. ``` 這是因為系統無法決定幾個可能的`~`操作符中究竟應該使用哪一個。 我們可以用明確地類型轉換來幫它: ``` SELECT ~ CAST('20' AS int8) AS "negation"; negation ---------- -21 (1 row) ``` **Example 10-4\. 數組包含操作符類型分析** 這里是解決一個操作符帶有一個已知和一個未知類型輸入的例子: ``` SELECT array[1,2] <@ '{1,2,3}' as "is subset"; is subset ----------- t (1 row) ``` PostgreSQL操作符表有幾條記錄對應于中綴操作符`&lt;@`, 但是只有兩個可以在左側接受一個整數數組的操作符是數組包含(`anyarray` `&lt;@` `anyarray`) 和范圍包含(`anyelement` `&lt;@` `anyrange`)的。 因為沒有多態的偽類型(參閱[Section 8.19](#calibre_link-540))是首選的,所以解析器不能解決這個基礎上的歧義。 然而,最后一個解析規則告訴我們,假設未知類型的文字是和另外一個輸入相同的類型,也就是,整數數組。 現在只有兩個操作符中的一個可以匹配,所以選擇數組包含。(如果我們選擇了范圍包含, 我們將得到一個錯誤,因為字符串沒有正確的格式成為范圍的文字。)
                  <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>

                              哎呀哎呀视频在线观看