9.17. 行和數組比較

本節描述一個特殊的構造,用於在組和數值之間進行多重比較。這些形式語法上和前面一節的子查詢形式相關,但是不涉及子查詢。 這種形式涉及的 數組子資料表達式是 PostgreSQL 的擴展; 其它的是 SQL 兼容的。所有本節記錄的資料表達式形式都返回布爾(Boolean)結果(真/假)。

9.17.1. IN

expression IN (value[, ...])

右手邊是一個圓括弧包圍的標量列資料表。如果左手邊的資料表達式結果等於任何右手邊資料表達式中的一個,結果為"真"。它是下面的方式的縮寫

expression = value1
OR
expression = value2
OR
...

請注意如果左手邊資料表達式生成空,或者沒有相等的右手邊數值並且至少有一個右手邊的資料表達式生成空,那麼 IN 構造的結果將為空, 而不是假。這是與 SQL 處理布爾和空值在一起的問題的時候的一般規則一致的。

9.17.2. NOT IN

expression NOT IN (value[, ...])

右手邊是一個圓括弧包圍的標量列資料表。如果左手邊的資料表達式結果不等於所有右手邊資料表達式的值,結果為"真"。它是下面的方式的縮寫

expression <> value1
AND
expression <> value2
AND
...

請注意如果左手邊資料表達式生成空,或者沒有相等的右手邊數值並且至少有一個右手邊的資料表達式生成空,那麼 NOT IN 構造的結果將為空, 而不是假。這是與 SQL 處理布爾和空值在一起的問題的時候的一般規則一致的。

提示: x NOT IN y 在所有場合都等效於 NOT (x IN y)。 但是,在處理空值的時候,用 NOT IN 比用 IN 更容易迷惑新手。 最好用正邏輯來資料表達您的條件。

9.17.3. ANY/SOME (數組)

expression operator ANY (array expression)
expression operator SOME (array expression)

右手邊是一個圓括弧包圍的資料表達式,它必須生成一個數組值。左手邊資料表達式使用給出的操作符 operator,對數組的每個元素進行計算和比較,這個操作符必須生成布爾結果。 如果獲取了任何真值結果,那麼 ANY 的結果是 "true"。 如果沒有找到真值結果(包括數組只有零元素的特例),那麼結果是 "false"

SOMEANY 的同義詞。

9.17.4. ALL (array)

expression operator ALL (array expression)

右手邊是一個圓括弧包圍的資料表達式,它必須生成一個數組值。左手邊資料表達式使用給出的操作符 operator,對數組的每個元素進行計算和比較,這個操作符必須 生成布爾結果。如果所有比較都生成真值結果,那麼 ALL 的結果是 "true"(包括數組只有零元素的特例)。 如果有任何假值結果,那麼結果是 "false"

9.17.5. 逐行比較

row_constructor operator row_constructor

兩遍都是一個行構造器;如 Section 4.2.11 裡所述。 兩個行必須有同等數目的字串。兩邊都被計算並且逐行比較。 目前,只允許用 =<> 操作符進行 逐行比較。如果兩行相等,結果是 "true",否則是假。

通常,資料表達式或者子查詢行裡的 NULL 是按照 SQL 布爾資料表達式的一般規則進行組合的。 如果兩個行對應的成員都是非空並且相等,那麼認為這兩行相等; 如果任意對應成員為非空且不等,那麼該兩行不等; 否則這樣的行比較的結果是未知(NULL)。

row_constructor IS DISTINCT FROM row_constructor

這些構造類似一個 <> 行比較, 但是它對空值輸入不生成空。而是任何空值都認為是不等於(區別於)任何非空值, 並且任何兩個空都認為是相等的(沒有區別)。因此,這個的結果將不是真就是假,絕不會是空。

row_constructor IS NULL
row_constructor IS NOT NULL

這個構造測試一行的數值時空還是非空。一個行值只有在至少有一個字串不為空的時候,才是非空。