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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 4.1\. 詞法結構 SQL 輸入由一系列_命令_組成。一條命令由一系列_記號_ 構成,用一個分號(";")結尾。輸入流的終止也結束一條命令。 哪些記號是合法的取決于特定命令的語法。 記號可以是一個_關鍵字_、_標識符_、 _引號包圍的標識符_、_文本_(或常量)、 特殊的字符符號。記號通常由空白分隔(空格/tab/換行符), 但如果不存在混淆的時候也可以不用(通常只是一個特殊字符與一些其它記號類型相連的時候)。 比如,下列命令是(語法上)合法的 SQL 輸入: ``` SELECT * FROM MY_TABLE; UPDATE MY_TABLE SET A = 5; INSERT INTO MY_TABLE VALUES (3, 'hi there'); ``` 這里是三條命令的序列,每條一行(盡管并不要求這么做;多條命令可以在一行里, 單條命令也可以合理地分裂成多行)。 另外,在 SQL 輸入里可以有_注釋_。它們不是記號,它們實際上等效于空白。 如果從哪些記號標識命令、哪些是操作數或參數的角度考慮,SQL 語法并不是非常一致。 通常頭幾個記號是命令名字,因此上面的例子我們通常可以說是一個"SELECT"、 一個"UPDATE"、和一個"INSERT"命令。不過,`UPDATE` 命令總是要求一個`SET`在某個位置出現,并且這個特定的`INSERT` 還要求有一個`VALUES`才完整。每條命令的準確語法規則都在[Part VI](#calibre_link-1234)里描述。 ## 4.1.1\. 標識符和關鍵字 像上面例子里的`SELECT`,`UPDATE`或`VALUES` 這樣的記號都是_關鍵字_的例子,也就是那些在 SQL 語言里有固定含義的單詞。記號`MY_TABLE`和`A` 是_標識符_的例子。根據使用它們的命令的不同, 它們標識表、字段、或者其它數據庫對象的名字。因此,有時候只是簡單地叫它們 "名字"。關鍵字和標識符有著同樣的詞法結構, 意思是我們在沒有認識這種語言之前是無法區分一個記號是標識符還是名字。 你可以在[Appendix C](#calibre_link-126)里找到一個關鍵字的完整列表。 SQL 標識符和關鍵字必須以一個字母(`a`-`z` 以及帶變音符的字母和非拉丁字母)或下劃線(`_`)開頭, 隨后的字符可以是字母、下劃線、數字(`0`-`9`)、 美元符號(`$`)。需要注意的是,根據 SQL 標準,美元符號不允許出現在標識符中, 因此使用美元符號將不易移植。SQL 標準不會定義包含數字或者以下劃線開頭或結尾的關鍵字, 因此按照這種格式定義的標識符是安全的,不會和將來標準的擴展特性沖突。 系統使用不超過`NAMEDATALEN`-1 個字符作為標識符; 你可以在命令中寫更長的名字,但它們會被截斷。`NAMEDATALEN`的缺省值是 64 , 因此標識符最大長度是 63 字節。如果覺得這個限制有問題,那么你可以在 `src/include/pg_config_manual.h`里修改`NAMEDATALEN`來改變它。 關鍵字和未被引號包圍的標識符都是大小寫無關的。因此: ``` UPDATE MY_TABLE SET A = 5; ``` 也可以等效地寫成: ``` uPDaTE my_TabLE SeT a = 5; ``` 一種好習慣是把關鍵字寫成大寫,而名字等用小寫: ``` UPDATE my_table SET a = 5; ``` 還有第二種標識符:_分隔標識符_或 _引號包圍的標識符_。 它是通過在雙引號(`"`)中包圍任意字符序列形成的。 分隔標識符總是一個標識符,而不是關鍵字。因此,你可以用`"select"` 表示一個字段或者表的名字,而一個沒有引號的`select` 將被當做一條命令的一部分,因此如果把它當做一個表名或者字段名使用的話就會產生一個分析錯誤。 上面的例子可以用引號包圍的標識符這么寫: ``` UPDATE "my_table" SET "a" = 5; ``` 引號包圍的標識符可以包含編碼不等于零的任意字符(要包含一個雙引號,可以寫兩個相連的雙引號)。 這樣我們就可以構造那些原本是不允許的表名或者字段名,比如那些包含空白或與號(&)的名字。 但長度限制依舊。 一個帶引號的標識符的變形允許帶有代碼點標記的逃逸Unicode字符。 該變形以`U&`開始(大/小寫U后跟有&符號)緊跟著打開的雙引號, 之間沒有空格,例如`U&"foo"`。(需要注意的是, 這可能產生和操作符`&`之間的歧義。可以在操作符周圍加上空格來避免該問題。) 在引號中,通過寫一個后面跟有反斜杠和四位十六進制代碼點或跟有反斜杠和加號和六位十六進制代碼點, Unicode字符可以寫成逃逸格式。 例如,`"data"`可以寫成: ``` U&"d\0061t\+000061" ``` 下例以西里爾字母寫俄文"slon"(象)。 ``` U&"\0441\043B\043E\043D" ``` 如果需要一個非反斜杠的不同的逃逸,可以通過在字符串之后使用`UESCAPE` 語句來進行聲明,如: ``` U&"d!0061t!+000061" UESCAPE '!' ``` 逃逸字符可以是一個十六進制數字以外的任何單個字符,加號,一個單引號,一個雙引號, 或一個空白字符。需要注意的是,逃逸字符是寫在單引號中,而不是雙引號中。 為了將逃逸字符寫到標識符中,可以將它寫兩次。 只有服務器字符集是`UTF8`時,才會完全使用Unicode逃逸語法。 當使用其他服務器字符集時,只有在ASCII內的(最多`\007F`)代碼點可以被聲明。 4位和6位的數字形式可以被用來將UTF-16代理對聲明為大于U+FFFF的帶有代碼點的字符, 盡管6位數字形式技術的可用性使得這樣做沒有必要。(代理對不是直接存儲的, 首先,它們結合成一個單一的代碼點,然后再用UTF-8編碼。) 把一個標識符用引號包圍起來同時也令它大小寫相關,而沒有引號包圍起來的名字總是轉成小寫。 比如,我們認為標識符`FOO`,`foo`和`"foo"` 是等價的PostgreSQL名字,但`"Foo"`和`"FOO"` 與上面三個以及它們之間都是不同的。PostgreSQL里對未加引號的名子總是轉換成小寫, 這和 SQL 標準是不兼容的,SQL 標準要求未用引號包圍起來的名字總是轉成大寫。因此根據標準, `foo`等于`"FOO"`但不等于`"foo"` 。 如果你想編寫可移植的程序,那么我們建議你要么就總是用引號包圍某個名字,要么就從來不引。 ## 4.1.2\. 常量 在PostgreSQL里有三種_隱含類型的常量_: 字符串、位串、數值。常量也可以聲明為明確的類型, 這樣就可以使用更準確的表現形式以及可以被系統更有效地處理。這些將在后面的小節描述。 ### 4.1.2.1\. 字符串常量 SQL 里的一個文本常量是用單引號(`'`)包圍的任意字符序列, 比如`'This is a string'` 。 在這種類型的字符串常量里嵌入單引號的標準兼容的做法是敲入兩個連續的單引號, 比如`'Dianne''s horse'`。注意:兩個連續的單引號_不是_雙引號(`"`)。 兩個只是通過_至少一個換行符_的空白分隔的字符串常量會被連接在一起, 并當做它們是寫成一個常量處理。比如: ``` SELECT 'foo' 'bar'; ``` 等效于: ``` SELECT 'foobar'; ``` 但: ``` SELECT 'foo' 'bar'; ``` 是非法的語法。這個怪異的行為是SQL聲明的,PostgreSQL遵循標準。 ### 4.1.2.2\. C風格的逃逸字符串常量 PostgreSQL還允許"逃逸"字符串中的內容, 這是一個PostgreSQL對SQL標準的擴展。逃逸字符串語法是通過在字符串前寫字母`E` (大寫或者小寫)的方法聲明的。比如`E'foo'`。(當需要續行包含逃逸字符的字符串時, 僅需要在第一行的開始引號前寫上`E`就可以了。)在逃逸字符串中, 通過一個反斜杠(`\`)開始C風格的_反斜杠逃逸_序列,在該逃逸中, 反斜杠與其之后字符的組合代表一個特殊的字節值,可參閱[Table 4-1](#calibre_link-2156)。 **Table 4-1\. 反斜杠逃逸序列** | 反斜杠逃逸序列 | 解釋 | | --- | --- | | `\b` | 退格 | | `\f` | 進紙 | | `\n` | 換行 | | `\r` | 回車 | | `\t` | 水平制表符 | | `\``_o_`, `\``_oo_`, `\``_ooo_` (`_o_` = 0 - 7) | 八進制字節值 | | `\x``_h_`, `\x``_hh_` (`_h_` = 0 - 9, A - F) | 十六進制字節值 | | `\u``_xxxx_`, `\U``_xxxxxxxx_` (`_x_` = 0 - 9, A - F) | 16或32位十六進制Unicode字符值 | 任何其它跟在反斜杠后面的字符都當做文本看待。因此,要在字符串常量里包含反斜杠, 則寫兩個反斜杠(`\\`)。另外,PostgreSQL 允許用一個反斜杠來逃逸單引號`\'`, 不過,將來版本 的 PostgreSQL 將不允許這么用。所以最好堅持使用符合標準的`''`。 你有必要為你所創建的字節序列(特別是在使用八進制或十六進制逃逸時)編寫有效的服務器字符集編碼字符。 當服務器編碼是UTF-8時,應該使用Unicode逃逸或另一種Unicode逃逸語法(參閱[Section 4.1.2.3](#calibre_link-1061))。 (后者通過寫出字節來處理UTF-8字符集,這樣做是很繁瑣的)。 只有服務器字符集是`UTF8`時,才會完全使用Unicode逃逸語法。 當使用其他服務器字符集時,只有在ASCII內的(最多`\u007F`)代碼點可以被聲明。 4位和8位的數字形式可以被用來將UTF-16代理對聲明為大于U+FFFF的帶有代碼點的字符, 盡管8位數字形式技術的可用性使得這樣做沒有必要。(當服務器編碼是`UTF8`時使用代理對, 首先,它們結合成一個單一的代碼點,然后再用UTF-8編碼) | **Caution** | |:--- | | 如果配置參數[standard_conforming_strings](#calibre_link-1031)的值是`off`, 那么PostgreSQL將能夠識別常規和逃逸字符串常量中的反斜杠逃逸。 然而,在PostgreSQL9.1中,參數值默認為`on`,這意味著反斜杠逃逸只能在逃逸字符串常量中識別。 這個行為更為標準兼容,但是可能會使依賴于歷史行為的應用程序崩潰,因為歷史行為中反斜杠逃逸總是能被識別。 作為一個變通方案,你可以設置這個參數為`off`,但是最好是不使用反斜杠逃逸。如果你需要使用反斜杠逃逸來表示特殊的字符, 那么請在字符串常量前加上`E`。 除`standard_conforming_strings`之外,[escape_string_warning](#calibre_link-1523) 和[backslash_quote](#calibre_link-2157)配置參數也影響字符串常量中反斜杠的處理。 | 編碼為零的字符不允許出現在字符串常量中。 ### 4.1.2.3\. Unicode逃逸字符串常量 PostgreSQL也支持其他類型的字符串逃逸語法, 允許聲明任意的帶有代碼點標記的Unicode字符。一個逃逸Unicode字符常量以 `U&`開始(大/小寫U后緊跟有&符號)緊跟著打開的單引號, 之間沒有空格,例如`U&'foo'`。(這可能產生和操作符`&` 之間的歧義。可以在操作符周圍加上空格來避免該問題。)在引號中, 通過寫一個后面跟有四位十六進制代碼點或跟有加號和六位十六進制代碼點的反斜杠, Unicode字符可以寫成逃逸格式。例如,`'data'`可以寫成: ``` U&'d\0061t\+000061' ``` 下例以西里爾字母寫俄文"slon"(象)。 ``` U&'\0441\043B\043E\043D' ``` 如果需要一個非反斜杠的不同的逃逸,可以通過在字符串之后使用 `UESCAPE`語句來進行聲明,如: ``` U&'d!0061t!+000061' UESCAPE '!' ``` 逃逸字符可以是一個十六進制數字以外的任何單個字符,加號,一個單引號, 一個雙引號,或一個空白字符。 只有服務器字符集是`UTF8`時,才會完全使用Unicode逃逸語法。 當使用其他服務器字符集時,只有在ASCII內的(最多`\007F`)代碼點可以被聲明。 4位和6位的數字形式可以被用來將UTF-16代理對聲明為大于U+FFFF的帶有代碼點的字符, 盡管6位數字形式技術的可用性使得這樣做沒有必要。(當服務器編碼是`UTF8`時使用代理對, 首先,它們結合成一個單一的代碼點,然后再用UTF-8編碼。) 同樣,字符串常量的Unicode逃逸語法只有當配置參數[standard_conforming_strings](#calibre_link-1031) 啟用時才能生效。否則,該語法在解析SQL語法時給客戶端造成混淆,導致SQL注入或其他安全問題。 如果該參數設為OFF,該語法會帶著一條錯誤消息一起被拒絕。 為了將逃逸字符寫到字符串中,可以將它寫兩次。 ### 4.1.2.4\. 美元符引用字符串常量 盡管聲明字符串常量的標準方法通常都很方便,但是如果字符串中包含很多單引號或者反斜杠, 那么理解字符串的內容可能就會變得很苦澀,因為每個單引號都要加倍。 為了讓這種場合下的查詢更具可讀性,PostgreSQL允許另外一種稱作 "美元符引用"的字符串常量書寫辦法。一個通過美元符引用聲明的字符串常量由一個美元符號 (`$`)、零個或多個字符組成的"標簽"、另一個美元符號、 組成字符串常量的任意字符序列、一個美元符號、與前面相同的標簽、一個美元符號組成的。 比如,下面是兩個不同的用美元符引用的方法聲明"Dianne's horse"的例子: ``` $$Dianne's horse$$ $SomeTag$Dianne's horse$SomeTag$ ``` 請注意,在美元符引用的字符串里,單引號不允許逃逸。實際上,在一個美元符引用的字符串里, 不允許逃逸任何字符:字符串內容總是按照字面內容書寫。反斜杠不是特殊的、 美元符自己也不是特殊的(除非它們和開標簽的一部分匹配)。 我們可以通過在不同嵌套級別使用不同的"標簽"來實現嵌套。最常見的是寫函數定義的時候。比如: ``` $function$ BEGIN RETURN ($1 ~ $q$[\t\r\n\v\\]$q$); END; $function$ ``` 這里,序列`$q$[\t\r\n\v\\]$q$`表示一個美元符引用的字符串文本`[\t\r\n\v\\]`, 在函數體被PostgreSQL執行的時候,它將被識別出來。 但是因為這個序列不匹配外層的美元符引用分隔符`$function$` ,所以只要考慮了外層字符串, 它就只是常量里面的普通字符而已。 一個美元符引用字符串的標簽(如果有標簽的話),遵循和無引號包圍的標識符相同的規則, 只是它不能包含美元符。標簽是大小寫敏感的,因此`$tag$String content$tag$` 是正確的,而`$TAG$String content$tag$`則是錯誤的。 一個后面緊跟著關鍵字或者標識符的美元符引用字符串必須用空白與其后的關鍵字或者標識符隔開; 否則美元符引用分隔符將會被當作標識符的開頭部分。 美元符引用不是 SQL 標準,但是在寫復雜的字符串文本的時候,它通常比標準的單引號語法更方便。 尤其是在其它常量里表現字符串常量的時候更有用,比如在過程函數定義里。如果用單引號語法, 每個上面例子里的每個反斜杠都必須寫四個,它們在作為字符串文本分析的時候會減少為兩個, 然后在函數執行的時候在內層字符串常量里會再次被解析為一個。 ### 4.1.2.5\. 位串常量 位串常量看起來很像在開引號前面有一個`B`(大寫或小寫)的普通字符串 (它們之間沒有空白),比如`B'1001'`。位串常量里可以用的字符只有`0` 和`1`。 另外,位串常量可以用十六進制表示法聲明,方法是使用前綴`X`(大寫或者小寫), 比如`X'1FF'`,其中的每個十六進制位等效于四個二進制位。 兩種形式的位串常量都可以像普通字符串常量那樣跨行連續。位串常量不能用美元符引用。 ### 4.1.2.6\. 數值常量 數值常量接受下列通用的形式: ``` _digits_ _digits_.[`_digits_`][e[+-]`_digits_`] [`_digits_`]._digits_[e[+-]`_digits_`] _digits_e[+-]_digits_ ``` 這里的`_digits_`是一個或多個十進制數字(0-9)。 如果有小數點,那么至少有一位在小數點前面或后面。 如果出現了指數標記(`e`)那么至少有一個數字跟在它后面。 在常量里不能有空格或者其它字符。請注意任何前導正號或負號實際上都不認為是常量的一部分; 它是施加于常量的一個操作符。 這里是一些合法的數值常量的例子: 42 3.5 4. .001 5e2 1.925e-3 如果一個數值常量既不包含小數點,也不包含指數, 那么如果它的數值可以放在`integer`類型中(32位),則認為它是`integer`類型; 如果它的數值可以放在`bigint`中(64位),則認為它是`bigint`, 否則認為它是`numeric`類型。包含小數點和/或指數的常量總是被認為是 `numeric`類型。 給一個數值常量賦予初始數據類型只是類型解析算法的開端。 在大多數情況下該常量會根據環境被自動強制轉換成最合適的類型。 必要時,你可以通過強制類型轉換把一個數值解析成特定的數據類型。 比如,你可以強制要求把一個數值當作`real` (`float4`)類型來看,方法是這么寫: ``` REAL '1.23' -- 字符串風格 1.23::REAL -- PostgreSQL (歷史的) 風格 ``` 這些實際上只是下面討論的通用轉換的特例。 ### 4.1.2.7\. 其它類型的常量 _任意_類型的常量都可以用下列表示法中的任何一種來輸入: ``` _type_ '_string_' '_string_'::_type_ CAST ( '_string_' AS _type_ ) ``` 其中字符串常量的文本將會被代入到類型`_type_`的輸入轉換過程。其結果是一個該類型的常量。 如果不存在該常量所屬類型的歧義,那么可以省略明確的類型轉換(比如,當你把它直接賦予一個表字段的時候), 這種情況下它會自動轉換。 其中的字符串常量可以用普通 SQL 表示法或者美元符引用來書寫。 我們還可以用函數風格的語法來聲明類型轉換: ``` _typename_ ( '_string_' ) ``` 不過并非所有類型名都可以這樣使用;參閱[Section 4.2.9](#calibre_link-1793)獲取細節。 `::`,`CAST()` 和函數調用語法也可以用于聲明任意表達式的運行時類型轉換(如[Section 4.2.9](#calibre_link-1793) 中討論的那樣)。為了避免語法歧義,`_type_` '`_string_`' 的形式只能用于聲明一個簡單的字面常量的類型。`_type_` '`_string_`' 的另外一個限制是它不能用于數組類型(要用`::`或 `CAST()` 聲明一個數組常量的類型)。 `CAST()`語法遵循 SQL 標準。`_type_` '`_string_`' 語法是標準的一個推廣:SQL 只是給少數幾種數據類型聲明了這個語法,但PostgreSQL 允許將其用于所有類型。`::`和函數調用的語法是PostgreSQL的歷史用法。 ## 4.1.3\. 操作符 一個操作符是最多 `NAMEDATALEN`-1 個(缺省63個)下列字符的序列: +?-?*?/?&lt;?&gt;?=?~?!?@?#?%?^?&?|?`?? 不過,有幾個限制: * `--` 和 `/*`不能出現在操作符中的任何地方, 因為它們會被當做注釋開始對待。 * 多字符操作符不能以`+` 或 `-`結束,除非其中至少還包含下列操作符之一: ~?!?@?#?%?^?&?|?`?? 比如,`@-`是允許的操作符,但`*-`不是。 這個限制允許PostgreSQL在不要求記號之間有空白的情況下分析 SQL 兼容的查詢。 當你使用非 SQL 標準的操作符的時候,你通常需要用空白分隔相鄰的操作符以避免歧義。 比如,如果你定義了一個叫`@`的左單目操作符,那么你就不能寫成 `X*@Y`;而是要寫成`X* @Y`以確保PostgreSQL 把它讀成兩個操作符,而不是一個。 ## 4.1.4\. 特殊字符 有些非字母數字字符有一些特殊含義,因此不能用做操作符。 它們的用法細節可以在相應的描述語法元素的地方找到。 本節只是描述它們的存在和概括一下這些字符的目的。 * 美元符號(`$`)后面跟著數字用于在一個函數體定義或者預備語句中表示參數的位置。 在其它環境里美元符號可能是一個標識符名字或者是一個美元符引用的字符串常量的一部分。 * 圓括弧(`()`)用于分組和強制優先級的時候含義與平常一樣。 有些場合里圓括弧是作為一個特定 SQL 命令的固定語法的一部分要求的。 * 方括弧(`[]`)用于選取數組元素。參閱[Section 8.15](#calibre_link-1759)獲取更多信息。 * 逗號(`,`)在一些語法構造里用于分隔一個列表的元素。 * 分號(`;`)結束一條 SQL 命令。它不能出現在一條命令里的任何地方, 除了在引號包圍的字符串常量或者標識符中。 * 冒號(`:`)用于從數組中選取"片段"(參閱 [Section 8.15](#calibre_link-1759))。在一些 SQL 方言里(比如嵌入 SQL),冒號用于前綴變量名。 * 星號(`*`)在某些環境里表示一個表的全部字段或者一個復合類型的值。 在用作聚集函數的參數時還表示該聚集并不需要明確的參數。 * 句點(`.`)用在數字常量里,并用于分隔模式、表、字段名。 ## 4.1.5\. 注釋 注釋是任意以雙劃線開頭并延伸到行尾的任意字符序列,比如: ``` -- 這是標準的 SQL 注釋 ``` 另外,還可以使用C風格的塊注釋: ``` /* 多行注釋 * 可以嵌套: /* 被嵌套的塊注釋 */ */ ``` 這里注釋以`/*`開頭并擴展到對應的`*/`。 這些塊注釋可以嵌套,就像 SQL標準里說的那樣(但和 C 不一樣), 因此我們可以注釋掉一大塊已經包含塊注釋的代碼。 注釋在進一步的語法分析之前被從輸入流中刪除并用空白代替。 ## 4.1.6\. 操作符優先級 [Table 4-2](#calibre_link-2158)顯示了PostgreSQL 里面的操作符的優先級和關聯性。大多數操作符都有相同的優先級并且都是左關聯的。 操作符的優先級和關聯性是硬連接到解析器的。這種情況可能會有不那么直觀的行為; 比如,布爾操作符`&lt;`和`&gt;`與布爾操作符`&lt;=`和 `&gt;=`之間有著不同的優先級。同樣,當你把雙目和單目操作符組合使用的時候, 有時候也需要加圓括弧。比如: ``` SELECT 5 ! - 6; ``` 會被分析成: ``` SELECT 5 ! (- 6); ``` 因為解析器不知道`!`被定義成了后綴操作符,而不是中綴操作符 (知道的時候只能是太晚了)。要在本例中獲得你需要的特性,你要寫成: ``` SELECT (5 !) - 6; ``` 這是我們為擴展性付出的代價。 **Table 4-2\. 操作符優先級(遞減)** | 操作符/元素 | 關聯性 | 描述 | | --- | --- | --- | | `.` | 左 | 表/字段名分隔符 | | `::` | 左 | PostgreSQL特有的類型轉換操作符 | | `[` `]` | 左 | 數組元素選擇 | | `+` `-` | 右 | 單目正號,單目負號 | | `^` | 左 | 冪 | | `*` `/` `%` | 左 | 乘,除,模 | | `+` `-` | 左 | 加,減 | | `IS` | `IS TRUE`, `IS FALSE`, `IS NULL`, etc | | `ISNULL` | 測試是否為NULL | | `NOTNULL` | 測試是否不為NULL | | (任何其他的) | 左 | 所有其他的本地和用戶定義操作符 | | `IN` | 集合成員 | | `BETWEEN` | 范圍包含 | | `OVERLAPS` | 時間間隔重疊 | | `LIKE` `ILIKE` `SIMILAR` | 字符串模式匹配 | | `&lt;` `&gt;` | 小于,大于 | | `=` | 右 | 等于,賦值 | | `NOT` | 右 | 邏輯非 | | `AND` | 左 | 邏輯與 | | `OR` | 左 | 邏輯或 | 請注意操作符優先級也適用于和上面提到的內置操作符同名的用戶定義操作符。 比如,如果你為一些客戶數據類型定義一個"+"操作符, 那么它和內置的"+"操作符有同樣的優先級,不管用它來干什么。 如果在`OPERATOR`語法里使用了模式修飾的操作符名,比如: ``` SELECT 3 OPERATOR(pg_catalog.+) 4; ``` 那么`OPERATOR`構造就會有[Table 4-2](#calibre_link-2158) 里面為"任何其它的" 操作符顯示的缺省優先級。不管什么特定的操作符出現在 `OPERATOR()`里都是這樣。
                  <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>

                              哎呀哎呀视频在线观看