支援的版本:目前 (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 / 7.3 / 7.2

9.24. 子查詢運算式 #

本節描述SQL相容的子查詢運算式,可在 PostgreSQL 中使用。本節文件中記錄的所有運算式形式都傳回布林值(true/false)結果。

9.24.1. EXISTS #

EXISTS (subquery)

EXISTS 的引數是任意 SELECT 陳述式,或子查詢。評估子查詢以判斷它是否傳回任何資料列。如果它傳回至少一個資料列,則 EXISTS 的結果為 true;如果子查詢未傳回任何資料列,則 EXISTS 的結果為 false

子查詢可以參照周圍查詢的變數,這些變數在子查詢的任何一次評估中都將充當常數。

通常只會執行子查詢以判斷是否傳回至少一個資料列,而不會一直執行到完成。編寫具有副作用(例如呼叫序列函數)的子查詢是不明智的;副作用是否發生可能是不可預測的。

由於結果僅取決於是否傳回任何資料列,而不取決於這些資料列的內容,因此子查詢的輸出清單通常並不重要。常見的編碼慣例是以 EXISTS(SELECT 1 WHERE ...) 的形式編寫所有 EXISTS 測試。但是,此規則也有例外情況,例如使用 INTERSECT 的子查詢。

這個簡單的範例類似於對 col2 的內部聯結,但即使有多個匹配的 tab2 資料列,它也最多為每個 tab1 資料列產生一個輸出資料列

SELECT col1
FROM tab1
WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

9.24.2. IN #

expression IN (subquery)

右手邊是括在括號中的子查詢,它必須只傳回一欄。評估左手邊的運算式,並將其與子查詢結果的每一列進行比較。如果找到任何相等的子查詢列,則 IN 的結果為 true。如果找不到相等的列(包括子查詢未傳回任何列的情況),則結果為 false

請注意,如果左手邊的運算式產生空值 (null),或者如果沒有相等的右手邊值且至少一個右手邊列產生空值,則 IN 建構的結果將為空值,而不是 false。這符合 SQL 對空值的布林組合的正常規則。

EXISTS 一樣,假設子查詢將被完全評估是不明智的。

row_constructor IN (subquery)

此形式的 IN 的左手邊是一個列建構函式,如第 4.2.13 節中所述。右手邊是一個括在括號中的子查詢,它必須傳回的欄數與左手邊列中的運算式數量完全相同。評估左手邊的運算式,並將其逐列與子查詢結果的每一列進行比較。如果找到任何相等的子查詢列,則 IN 的結果為 true。如果找不到相等的列(包括子查詢未傳回任何列的情況),則結果為 false

與往常一樣,根據 SQL 布林運算式的正常規則組合列中的空值。如果它們的所有對應成員都是非空值且相等,則認為兩個列相等;如果任何對應成員是非空值且不相等,則認為這些列不相等;否則,該列比較的結果是未知的(空值)。如果每個列的結果都不相等或為空值,且至少有一個空值,則 IN 的結果為空值。

9.24.3. NOT IN #

expression NOT IN (subquery)

右手邊是括在括號中的子查詢,它必須只傳回一欄。評估左手邊的運算式,並將其與子查詢結果的每一列進行比較。如果僅找到不相等的子查詢列(包括子查詢未傳回任何列的情況),則 NOT IN 的結果為 true。如果找到任何相等的列,則結果為 false

請注意,如果左手邊的運算式產生空值,或者如果沒有相等的右手邊值且至少一個右手邊列產生空值,則 NOT IN 建構的結果將為空值,而不是 true。這符合 SQL 對空值的布林組合的正常規則。

EXISTS 一樣,假設子查詢將被完全評估是不明智的。

row_constructor NOT IN (subquery)

NOT IN 形式的左側是一個資料列建構器,如第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須傳回與左側資料列中的運算式完全一樣多的欄位。左側的運算式會被評估,並逐列與子查詢結果的每一列進行比較。如果只找到不相等的子查詢資料列(包括子查詢未傳回任何資料列的情況),則 NOT IN 的結果為 true。如果找到任何相等的資料列,則結果為 false

與往常一樣,資料列中的空值會根據 SQL 布林運算式的標準規則進行組合。如果它們所有對應的成員都不是空值且相等,則認為兩個資料列相等;如果任何對應的成員不是空值且不相等,則資料列不相等;否則,該資料列比較的結果未知(空值)。如果所有逐列結果皆為不相等或空值,且至少有一個空值,則 NOT IN 的結果為空值。

9.24.4. ANY/SOME #

expression operator ANY (subquery)
expression operator SOME (subquery)

右側是一個帶括號的子查詢,它必須正好傳回一個欄位。左側的運算式會被評估,並使用給定的 operator 與子查詢結果的每一列進行比較,該 operator 必須產生布林值結果。如果獲得任何 true 結果,則 ANY 的結果為 true。如果沒有找到任何 true 結果(包括子查詢未傳回任何資料列的情況),則結果為 false

SOMEANY 的同義詞。IN 等效於 = ANY

請注意,如果沒有任何成功,且至少有一個右側資料列為運算子的結果產生空值,則 ANY 建構的結果將為空值,而不是 false。這符合 SQL 關於空值布林組合的標準規則。

EXISTS 一樣,假設子查詢將被完全評估是不明智的。

row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)

ANY 形式的左側是一個資料列建構器,如第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須傳回與左側資料列中的運算式完全一樣多的欄位。左側的運算式會被評估,並使用給定的 operator 逐列與子查詢結果的每一列進行比較。如果比較為任何子查詢資料列傳回 true,則 ANY 的結果為 true。如果比較為每個子查詢資料列傳回 false(包括子查詢未傳回任何資料列的情況),則結果為 false。如果與子查詢資料列的比較都沒有傳回 true,且至少有一個比較傳回 NULL,則結果為 NULL。

有關資料列建構器比較的含義的詳細資訊,請參閱第 9.25.5 節

9.24.5. ALL #

expression operator ALL (subquery)

右側是一個帶括號的子查詢,它必須正好傳回一個欄位。左側的運算式會被評估,並使用給定的 operator 與子查詢結果的每一列進行比較,該 operator 必須產生布林值結果。如果所有資料列都傳回 true(包括子查詢未傳回任何資料列的情況),則 ALL 的結果為 true。如果找到任何 false 結果,則結果為 false。如果與子查詢資料列的比較都沒有傳回 false,且至少有一個比較傳回 NULL,則結果為 NULL。

NOT IN 等效於 <> ALL

EXISTS 一樣,假設子查詢將被完全評估是不明智的。

row_constructor operator ALL (subquery)

ALL 形式的左側是一個資料列建構器,如第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須傳回與左側資料列中的運算式完全一樣多的欄位。左側的運算式會被評估,並使用給定的 operator 逐列與子查詢結果的每一列進行比較。如果比較為所有子查詢資料列傳回 true(包括子查詢未傳回任何資料列的情況),則 ALL 的結果為 true。如果比較為任何子查詢資料列傳回 false,則結果為 false。如果與子查詢資料列的比較都沒有傳回 false,且至少有一個比較傳回 NULL,則結果為 NULL。

有關資料列建構器比較的含義的詳細資訊,請參閱第 9.25.5 節

9.24.6. 單列比較 #

row_constructor operator (subquery)

此左側是一個資料列建構器,如第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須傳回與左側資料列中的運算式完全一樣多的欄位。此外,子查詢不能傳回多個資料列。(如果它傳回零個資料列,則結果將被視為空值。)左側會被評估,並逐列與單個子查詢結果資料列進行比較。

有關資料列建構器比較的含義的詳細資訊,請參閱第 9.25.5 節

提交更正

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