本節描述了幾個專門的結構,用於在值組之間進行多次比較。這些形式在語法上與前一節的子查詢形式相關,但不涉及子查詢。涉及陣列子表示式的形式是 PostgreSQL 擴充功能;其餘的是SQL- 相容的。本節中記錄的所有表示式形式都傳回布林值(true/false)結果。
IN
#expression
IN (value
[, ...])
右側是一個帶括號的表示式清單。如果左側表示式的結果等於任何右側表示式,則結果為 「true」。這是以下內容的簡寫符號:
expression
=value1
ORexpression
=value2
OR ...
請注意,如果左側表示式產生空值 (null),或者如果沒有相等的右側值,且至少有一個右側表示式產生空值,則 IN
結構的結果將為空值,而不是 false。這符合 SQL 對空值布林組合的標準規則。
NOT IN
#expression
NOT IN (value
[, ...])
右側是一個帶括號的表示式清單。如果左側表示式的結果與所有右側表示式都不相等,則結果為 「true」。這是以下內容的簡寫符號:
expression
<>value1
ANDexpression
<>value2
AND ...
請注意,如果左側表示式產生空值 (null),或者如果沒有相等的右側值,且至少有一個右側表示式產生空值,則 NOT IN
結構的結果將為空值,而不是人們天真地期望的 true。這符合 SQL 對空值布林組合的標準規則。
x NOT IN y
在所有情況下都等同於 NOT (x IN y)
。但是,在使用 NOT IN
時,空值比在使用 IN
時更容易讓新手犯錯。如果可能,最好以肯定方式表達您的條件。
ANY
/SOME
(陣列) #expression
operator
ANY (array expression
)expression
operator
SOME (array expression
)
右側是一個帶括號的表示式,它必須產生一個陣列值。左側表示式會被評估,並使用給定的 operator
與陣列的每個元素進行比較,而 operator
必須產生一個布林值結果。如果獲得任何 true 結果,則 ANY
的結果為 「true」。如果未找到任何 true 結果(包括陣列具有零個元素的情況),則結果為 「false」。
如果陣列表示式產生空值陣列,則 ANY
的結果將為空值。如果左側表示式產生空值,則 ANY
的結果通常為空值(儘管非嚴格的比較運算子可能會產生不同的結果)。此外,如果右側陣列包含任何空值元素且未獲得任何 true 比較結果,則 ANY
的結果將為空值,而不是 false(同樣,假設使用嚴格的比較運算子)。這符合 SQL 對空值布林組合的標準規則。
SOME
是 ANY
的同義詞。
ALL
(陣列) #expression
operator
ALL (array expression
)
右側是一個帶括號的表示式,它必須產生一個陣列值。左側表示式會被評估,並使用給定的 operator
與陣列的每個元素進行比較,而 operator
必須產生一個布林值結果。如果所有比較都產生 true(包括陣列具有零個元素的情況),則 ALL
的結果為 「true」。如果找到任何 false 結果,則結果為 「false」。
如果陣列表達式產生一個空陣列,則 ALL
的結果將為 null。如果左側的表達式產生 null,則 ALL
的結果通常為 null (儘管非嚴格的比較運算子可能會產生不同的結果)。 此外,如果右側的陣列包含任何 null 元素,並且沒有獲得 false 的比較結果,則 ALL
的結果將為 null,而不是 true(同樣,假設使用嚴格的比較運算子)。 這符合 SQL 中布林值組合的 null 值的正常規則。
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 FROMrow_constructor
此建構類似於 <>
列比較,但它不會為 null 輸入產生 null。 相反,任何 null 值都被認為與任何非 null 值不相等(不同),並且任何兩個 null 都被認為是相等的(非不同)。 因此,結果將為 true 或 false,永遠不會為 null。
row_constructor
IS NOT DISTINCT FROMrow_constructor
此建構類似於 =
列比較,但它不會為 null 輸入產生 null。 相反,任何 null 值都被認為與任何非 null 值不相等(不同),並且任何兩個 null 都被認為是相等的(非不同)。 因此,結果始終為 true 或 false,永遠不會為 null。
record
operator
record
SQL 規範要求,如果結果取決於比較兩個 NULL 值或一個 NULL 和一個非 NULL,則逐列比較應傳回 NULL。 只有在比較兩個列建構元的結果(如第 9.25.5 節中)或將列建構元與子查詢的輸出進行比較(如第 9.24 節中)時,PostgreSQL 才會執行此操作。 在比較兩個複合類型值的其他情況下,兩個 NULL 欄位值被認為相等,並且 NULL 被認為大於非 NULL。 為了使複合類型具有一致的排序和索引行為,這是必要的。
每一側都會被評估,然後它們會逐列進行比較。 當 operator
為 =
、<>
、<
、<=
、>
或 >=
,或是具有與其中之一相似的語意時,才允許進行複合類型比較。(具體來說,如果運算子是 B-tree 運算子類的成員,或是 B-tree 運算子類 =
成員的否定式,則運算子可以是列比較運算子。)上述運算子的預設行為與列建構元的 IS [ NOT ] DISTINCT FROM
相同(請參閱第 9.25.5 節)。
為了支援符合包含沒有預設 B-tree 運算子類的元素的列,為複合類型比較定義了以下運算子:*=
、*<>
、*<
、*<=
、*>
和 *>=
。這些運算子比較兩個列的內部二進位表示。 即使兩個列與相等運算子的比較結果為 true,兩個列也可能具有不同的二進位表示。 在這些比較運算子下的列排序是確定性的,但沒有其他意義。 這些運算子在內部用於實體化檢視,並且可能對於其他特殊用途(例如複寫和 B-Tree 重複資料刪除)很有用(請參閱第 64.1.4.3 節)。 但它們並非旨在廣泛用於編寫查詢。
如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步澄清的內容,請使用此表單來報告文件問題。