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 / 7.3 / 7.2

9.24. 子查詢表示式 #

本節介紹 PostgreSQL 中可用的符合 SQL 標準的子查詢表示式。本節中記錄的所有表示式形式都返回布林值(真/假)。SQL-compliant subquery expressions available in PostgreSQL. All of the expression forms documented in this section return Boolean (true/false) results.

9.24.1. EXISTS #

EXISTS (subquery)

EXISTS 的引數是任意 SELECT 語句,或者稱為子查詢。子查詢將被計算以確定它是否返回任何行。如果它至少返回一行,則 EXISTS 的結果為“true”;如果子查詢不返回任何行,則 EXISTS 的結果為“false”。

子查詢可以引用外部查詢中的變數,這些變數在子查詢的任何一次計算中都將充當常量。

子查詢通常只執行到足以確定是否至少返回一行,而不是完全執行完畢。編寫具有副作用(例如呼叫序列函式)的子查詢是不明智的;副作用是否發生可能無法預測。

由於結果僅取決於是否返回任何行,而與這些行的內容無關,因此子查詢的輸出列表通常不重要。常見的編碼約定是將所有 EXISTS 測試寫成 EXISTS(SELECT 1 WHERE ...) 的形式。但是,此規則也有例外,例如使用 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,或者沒有相等的右側值且至少有一個右側行產生 null,則 IN 構造的結果將是 null,而不是 false。這符合 SQL 關於 null 值布林組合的常規規則。

EXISTS 一樣,假定子查詢會完全評估是不明智的。

row_constructor IN (subquery)

此形式的 IN 的左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。左側表示式將被計算並逐行與子查詢結果的每一行進行比較。如果找到任何相等的子查詢行,則 IN 的結果為“true”。如果沒有找到相等的行(包括子查詢不返回任何行的情況),則結果為“false”。

一如既往,行中的 null 值按照 SQL 布林表示式的常規規則組合。兩行被認為相等,如果它們的所有對應成員都非 null 且相等;如果任何對應成員非 null 且不相等,則這些行不相等;否則,該行比較的結果未知(null)。如果所有逐行結果都是不相等或 null,且至少有一個 null,則 IN 的結果為 null。

9.24.3. NOT IN #

expression NOT IN (subquery)

右側是一個帶括號的子查詢,它必須返回一個且僅一個列。左側表示式將被計算並與子查詢結果的每一行進行比較。如果僅找到不相等的子查詢行(包括子查詢不返回任何行的情況),則 NOT IN 的結果為“true”。如果找到任何相等的行,則結果為“false”。

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

EXISTS 一樣,假定子查詢會完全評估是不明智的。

row_constructor NOT IN (subquery)

此形式的 NOT IN 的左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。左側表示式將被計算並逐行與子查詢結果的每一行進行比較。如果僅找到不相等的子查詢行(包括子查詢不返回任何行的情況),則 NOT IN 的結果為“true”。如果找到任何相等的行,則結果為“false”。

一如既往,行中的 null 值按照 SQL 布林表示式的常規規則組合。兩行被認為相等,如果它們的所有對應成員都非 null 且相等;如果任何對應成員非 null 且不相等,則這些行不相等;否則,該行比較的結果未知(null)。如果所有逐行結果都是不相等或 null,且至少有一個 null,則 NOT IN 的結果為 null。

9.24.4. ANY/SOME #

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

右側是一個帶括號的子查詢,它必須返回一個且僅一個列。左側表示式將被計算並使用給定的運算子與子查詢結果的每一行進行比較,該運算子必須產生布爾結果。如果獲得任何真結果,則 ANY 的結果為“true”。如果沒有找到真結果(包括子查詢不返回任何行的情況),則結果為“false”。

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

請注意,如果沒有成功,並且至少有一行右側的值對該運算子的結果為 null,則 ANY 構造的結果將是 null,而不是 false。這符合 SQL 關於 null 值布林組合的常規規則。

EXISTS 一樣,假定子查詢會完全評估是不明智的。

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

此形式的 ANY 的左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。左側表示式將被計算並逐行與子查詢結果的每一行進行比較,使用給定的運算子。如果比較對於任何子查詢行返回 true,則 ANY 的結果為“true”。如果比較對於每個子查詢行都返回 false(包括子查詢不返回任何行的情況),則結果為“false”。如果沒有任何與子查詢行的比較返回 true,並且至少有一個比較返回 NULL,則結果為 NULL。

有關行建構函式比較含義的詳細資訊,請參閱 第 9.25.5 節

9.24.5. ALL #

expression operator ALL (subquery)

右側是一個帶括號的子查詢,它必須返回一個且僅一個列。左側表示式將被計算並使用給定的運算子與子查詢結果的每一行進行比較,該運算子必須產生布爾結果。如果所有行都返回 true(包括子查詢不返回任何行的情況),則 ALL 的結果為“true”。如果找到任何 false 結果,則結果為“false”。如果沒有任何與子查詢行的比較返回 false,並且至少有一個比較返回 NULL,則結果為 NULL。

NOT IN 等同於 <> ALL

EXISTS 一樣,假定子查詢會完全評估是不明智的。

row_constructor operator ALL (subquery)

此形式的 ALL 的左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。左側表示式將被計算並逐行與子查詢結果的每一行進行比較,使用給定的運算子。如果比較對於所有子查詢行都返回 true(包括子查詢不返回任何行的情況),則 ALL 的結果為“true”。如果比較對於任何子查詢行都返回 false,則結果為“false”。如果沒有任何與子查詢行的比較返回 false,並且至少有一個比較返回 NULL,則結果為 NULL。

有關行建構函式比較含義的詳細資訊,請參閱 第 9.25.5 節

9.24.6. 單行比較 #

row_constructor operator (subquery)

左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。此外,子查詢不能返回多於一行。(如果它返回零行,則結果被視為 null。)左側表示式將被計算並逐行與唯一的子查詢結果行進行比較。

有關行建構函式比較含義的詳細資訊,請參閱 第 9.25.5 節

提交更正

如果您在文件中發現任何不正確之處、與您實際使用該功能時遇到的情況不符,或者需要進一步澄清之處,請使用 此表單 報告文件問題。