?
本文檔使用
php中文網手冊 發(fā)布
本節(jié)描述幾個特殊的構造,用于在多組值之間進行多重比較。 這些形式語法上和上一節(jié)的子查詢形式相關,但是不涉及子查詢。 這種形式涉及的數組子表達式是PostgreSQL的擴展; 其它的是SQL兼容的。所有本節(jié)記錄的表達式形式都返回布爾值(真/假)。
expressionIN (value[, ...])
右邊是一個圓括號括起來的標量列表。如果左邊的表達式結果等于任何右邊表達式中的一個, 結果為"真"true""。它是下面這種方式的縮寫
expression=value1 OR expression=value2 OR ...
請注意,如果左邊表達式的值為 NULL ,或者沒有相等的右邊值并且至少有一 個右邊表達式的值為 NULL ,那么IN的結果將是 NULL , 而不是假。這個行為遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則
expressionNOT IN (value[, ...])
右邊是一個圓括號括起來的標量列表。如果左邊的表達式結果不等于任何右邊表達式, 結果為"真"true""。它是下面這種方式的縮寫
expression<>value1 AND expression<>value2 AND ...
請注意,如果左邊表達式的值為 NULL ,或者沒有相等的右邊值并且至少 有一個右邊表達式的值為 NULL ,那么NOT IN的結果將是 NULL , 而不是真。這個行為遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則。
Tip: x NOT IN y在所有場合都等價于NOT (x IN y)。但是,在處理 NULL 的時候, 用NOT IN比用IN更容易迷惑新手。最好用正邏輯來表達你的條件。
expressionoperatorANY (array expression) expressionoperatorSOME (array expression)
右邊是一個圓括號括起來的表達式,它必須生成一個數組值。 左邊表達式使用operator對數組的每一個元素進行一次計算和比較, 其結果必須是布爾值。如果至少獲得一個真值,則ANY結果為"真"true""。 如果全部獲得假值,則結果是"假"false""(包括數組不含任何元素的情況)。
如果數組表達式的值為 NULL ,那么ANY的結果也為 NULL 。如果左邊表達式的 值為 NULL ,那么ANY的結果通常也為 NULL(某些不嚴格的比較操作符可能得到 不同的結果)。另外,如果右邊的數組表達式中包含 NULL 元素并且沒有為真的比較結果, 那么 ANY 的結果將是 NULL(某些不嚴格的比較操作符可能得到不同的結果), 而不是假。這個行為遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則
SOME是ANY的同意詞。
expressionoperatorALL (array expression)
右邊是一個圓括號括起來的表達式,它必須生成一個數組值。左邊表達式 使用operator對數組的每一個元素進行一次計算和比較,其結果必須是布爾值。 如果全部獲得真值,ALL 結果為"真"true""(包括數組不含任何元素的情況)。如果至少獲得一個假值,則結果是"假"。
如果數組表達式產生一個NULL數組,結果將為 NULL。如果左邊表達式的值為 NULL ,那么ALL的結果通常也為 NULL(某些不嚴格的比較 操作符可能得到不同的結果)。另外,如果右邊的數組表達式中包含 NULL 元素并且沒有為假的比較結果,那么ALL的結果將是 NULL(某些不嚴格的比較操作符可能得到不同的結果), 而不是真。這個行為遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則。
row_constructoroperatorrow_constructor
兩邊都是一個Section 4.2.12所述的行構造器;兩個行的字段數必須相同。 兩邊都被計算并且逐行比較。目前,用于比較的operator 操作符僅允許為=, <>, <, <=, >or >=,或與其具有相似的語意。 特別地,如果一個操作符屬于 B-Tree 操作符類, 那么該操作符可以是一個行比較操作符或除=之外的 B-Tree 操作符類。
=和<>與其它操作符稍有區(qū)別。如果兩行對應的元素全都非空且相等, 那么這兩行就被認為是相等的;如果兩行對應的元素中有任意一對非空且不等, 那么這兩行就被認為是不等的;否則這兩行的比較結果是未知(NULL)。
對于<,<=,>和 >=操作符,行中的元素將按照從左到右的順序依次進行比較, 直到遇見一對不相等的元素或者一對 NULL 值。如果這對元素中存在至少一個 NULL 值, 那么比較的結果是 NULL ;否則這對元素的比較結果就是最終的比較結果。 例如,ROW(1,2,NULL) < ROW(1,3,0)的結果是真而不是 NULL , 因為比較到第二對元素的時候就已經得到了最終結果,不需要對第三對元素進行比較了。
Note: 在PostgreSQL8.2之前,<,<=,>>=并不遵守 SQL 標準。 比如,ROW(a,b) < ROW(c,d)將等價于a < c AND b < d, 而正確的做法應當是等價于 a< c OR (a = c AND b< d) 。
row_constructorIS DISTINCT FROMrow_constructor
這個構造類似于<>行比較,但是它對 NULL 輸入不生成 NULL , 而是認為任何 NULL 都不等于任何非 NULL ,并且 NULL 之間是相等的。 因此,結果要么是真要么是假,而絕不會是未知(NULL)。
row_constructorIS NOT DISTINCT FROMrow_constructor
這個構造類似于=行比較,但是它對 NULL 輸入不生成 NULL , 而是認為任何 NULL 都不等于任何非 NULL ,并且 NULL 之間是相等的。 因此,結果要么是真要么是假,而絕不會是未知(NULL)。
Note: 如果比較兩個NULL值或一個NULL值和一個非NULL值,SQL 規(guī)范要求行式比較返回 NULL。 PostgreSQL這樣做僅當兩行構造的結果或一行構造子句的輸出 (像這里Section 9.20)。在其它情況下,兩個復合型的值進行比較,認為兩NULL字段值是相等的,NULL大于非NULL。 這是必要的,才能有一致的排序和復合類型的索引行為。