2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不再支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

9.25. 行和陣列比較 #

本節描述了幾種用於對值組進行多重比較的專用構造。這些形式在語法上與上一節的子查詢形式相關,但不涉及子查詢。涉及陣列子表示式的形式是PostgreSQL的擴充套件;其餘形式符合SQL-標準。本節記錄的所有表示式形式都返回布林(真/假)結果。

9.25.1. IN #

expression IN (value [, ...])

右側是一個用括號括起來的表示式列表。如果左側表示式的結果等於右側任何一個表示式,則結果為。這是以下內容的簡寫表示:

expression = value1
OR
expression = value2
OR
...

請注意,如果左側表示式產生 NULL,或者沒有相等的右側值且至少一個右側表示式產生 NULL,則 IN 構造的結果將是 NULL,而不是 FALSE。這符合 SQL 對 NULL 值布林組合的正常規則。

9.25.2. NOT IN #

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

右側是一個用括號括起來的表示式列表。如果左側表示式的結果不等於右側所有表示式,則結果為。這是以下內容的簡寫表示:

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

請注意,如果左側表示式產生 NULL,或者沒有相等的右側值且至少一個右側表示式產生 NULL,則 NOT IN 構造的結果將是 NULL,而不是像人們可能 naively 預期的那樣是 TRUE。這符合 SQL 對 NULL 值布林組合的正常規則。

提示

x NOT IN y 在所有情況下都等同於 NOT (x IN y)。然而,在處理 NOT IN 時,NULL 值比處理 IN 時更容易使新手感到困惑。如果可能,最好以積極的方式表達您的條件。

9.25.3. ANY/SOME (陣列) #

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

右側是一個用括號括起來的表示式,它必須產生一個數組值。左側表示式被計算,並使用給定的operator與陣列中的每個元素進行比較,該operator必須產生一個布林結果。如果得到任何真結果,則 ANY 的結果為。如果未找到真結果(包括陣列為空的情況),則結果為

如果陣列表示式產生一個 NULL 陣列,則 ANY 的結果將是 NULL。如果左側表示式產生 NULL,則 ANY 的結果通常是 NULL(儘管非嚴格的比較運算子可能產生不同的結果)。此外,如果右側陣列包含任何 NULL 元素且未獲得真比較結果,則 ANY 的結果將是 NULL,而不是 FALSE(同樣,假設使用嚴格的比較運算子)。這符合 SQL 對 NULL 值布林組合的正常規則。

SOMEANY 的同義詞。

9.25.4. ALL (陣列) #

expression operator ALL (array expression)

右側是一個用括號括起來的表示式,它必須產生一個數組值。左側表示式被計算,並使用給定的operator與陣列中的每個元素進行比較,該operator必須產生一個布林結果。如果所有比較都產生真(包括陣列為空的情況),則 ALL 的結果為。如果找到任何假結果,則結果為

如果陣列表示式產生一個 NULL 陣列,則 ALL 的結果將是 NULL。如果左側表示式產生 NULL,則 ALL 的結果通常是 NULL(儘管非嚴格的比較運算子可能產生不同的結果)。此外,如果右側陣列包含任何 NULL 元素且未獲得假比較結果,則 ALL 的結果將是 NULL,而不是 TRUE(同樣,假設使用嚴格的比較運算子)。這符合 SQL 對 NULL 值布林組合的正常規則。

9.25.5. 行構造器比較 #

row_constructor operator row_constructor

每一側都是一個行構造器,如第 4.2.13 節中所述。兩個行構造器必須具有相同數量的欄位。給定的operator應用於每一對對應的欄位。(由於欄位可能是不同型別,這意味著每對欄位可能會選擇不同的具體運算子。)所有選定的運算子都必須屬於某個 B-tree 運算子類,或者是一個 B-tree 運算子類中 = 運算子的否定運算子,這意味著行構造器比較僅在operator=, <>, <, <=, >, 或 >=,或者其語義與其中之一類似時才可能。)

=<> 的情況與其他情況略有不同。如果兩個行的所有對應成員都非 NULL 且相等,則認為這兩個行相等;如果任何對應成員非 NULL 且不相等,則認為這兩個行不相等;否則,行比較的結果為未知(NULL)。

對於 <, <=, >>= 的情況,行元素從左到右進行比較,一旦找到不相等或 NULL 的元素對就停止。如果這對元素中的任何一個為 NULL,則行比較的結果為未知(NULL);否則,該對元素的比較將決定結果。例如,ROW(1,2,NULL) < ROW(1,3,0) 返回 TRUE,而不是 NULL,因為第三對元素未被考慮。

row_constructor IS DISTINCT FROM row_constructor

此構造類似於 <> 行比較,但它不會為 NULL 輸入返回 NULL。相反,任何 NULL 值都被認為與任何非 NULL 值不相等(不同),並且任何兩個 NULL 值都被認為相等(不不同)。因此,結果要麼為 TRUE,要麼為 FALSE,絕不會是 NULL。

row_constructor IS NOT DISTINCT FROM row_constructor

此構造類似於 = 行比較,但它不會為 NULL 輸入返回 NULL。相反,任何 NULL 值都被認為與任何非 NULL 值不相等(不同),並且任何兩個 NULL 值都被認為相等(不不同)。因此,結果將始終為 TRUE 或 FALSE,絕不會是 NULL。

9.25.6. 複合型別比較 #

record operator record

SQL 標準要求行比較在比較兩個 NULL 值或一個 NULL 和一個非 NULL 值時返回 NULL。 PostgreSQL 僅在比較兩個行構造器的結果(如第 9.25.5 節)或將行構造器與子查詢的輸出進行比較(如第 9.24 節)時執行此操作。在其他比較兩個複合型別值的上下文中,兩個 NULL 欄位值被認為相等,而 NULL 被認為大於非 NULL。這對於複合型別具有一致的排序和索引行為是必需的。

每一側都被計算並逐行進行比較。當operator=, <>, <, <=, >>=,或者其語義與其中之一類似時,允許複合型別比較。(具體來說,如果一個運算子是一個 B-tree 運算子類的成員,或者是一個 B-tree 運算子類中 = 成員的否定運算子,那麼它就可以是一個行比較運算子。)上述運算子的預設行為與行構造器的 IS [ NOT ] DISTINCT FROM 相同(參見第 9.25.5 節)。

為了支援包含沒有預設 B-tree 運算子類的元素的行的匹配,為複合型別比較定義了以下運算子:*=, *<>, *<, *<=, *>, 和 *>=。這些運算子比較行的內部二進位制表示。即使使用相等運算子比較兩個行返回 TRUE,兩個行也可能具有不同的二進位制表示。這些比較運算子下的行順序是確定的,但否則無意義。這些運算子在內部用於物化檢視,並且可能用於其他專用目的,例如複製和 B-Tree 去重(參見第 65.1.4.3 節)。但它們並不打算普遍用於編寫查詢。

提交更正

如果您在文件中發現任何不正確、不符合您對特定功能的使用體驗或需要進一步澄清的內容,請使用此表單報告文件問題。