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

7.3. 選擇列表 #

如上一節所示,SELECT 命令中的表述式通過組合表、檢視、排除列、分組等方式來構建一個中間虛擬表。這個表最終會傳遞給選擇列表進行處理。選擇列表決定了中間表中的哪些欄位實際輸出。

7.3.1. 選擇列表項目 #

最簡單的選擇列表類型是 *,它會發出表述式產生的所有欄位。否則,選擇列表是一個以逗號分隔的值表達式列表(如第 4.2 節中所定義)。例如,它可以是欄位名稱的列表

SELECT a, b, c FROM ...

欄位名稱 abc 要麽是 FROM 子句中引用的表欄位的實際名稱,要麽是賦予它們的別名,如第 7.2.1.2 節中所述。選擇列表中可用的名稱空間與 WHERE 子句中的相同,除非使用分組,在這種情況下,它與 HAVING 子句中的相同。

如果多個表具有相同名稱的欄位,則還必須給出表名稱,如

SELECT tbl1.a, tbl2.a, tbl1.b FROM ...

使用多個表時,請求特定表的所有欄位也可能很有用

SELECT tbl1.*, tbl2.a FROM ...

有關 table_name.* 標記法的更多資訊,請參閱第 8.16.5 節

如果在選擇列表中使用了任意值表達式,則概念上會向傳回的表中新增一個新的虛擬欄位。對於每個結果列,都會對該值表達式求值一次,並將該列的值替換為任何欄位參考。但是,選擇列表中的表達式不必參考 FROM 子句的表述式中的任何欄位;例如,它們可以是常量算術表達式。

7.3.2. 欄位標籤 #

可以為選擇列表中的條目分配名稱,以供後續處理使用,例如在 ORDER BY 子句中使用或由客戶端應用程式顯示。例如

SELECT a AS value, b + c AS sum FROM ...

如果未使用 AS 指定輸出欄位名稱,則系統會分配預設欄位名稱。對於簡單的欄位參考,這是被參考欄位的名稱。對於函數呼叫,這是函數的名稱。對於複雜的表達式,系統將產生通用名稱。

AS 關鍵字通常是可選的,但在某些情況下,當所需的欄位名稱與 PostgreSQL 關鍵字匹配時,您必須編寫 AS 或使用雙引號引住欄位名稱,以避免歧義。(附錄 C 顯示了哪些關鍵字需要使用 AS 作為欄位標籤。)例如,FROM 就是這樣的一個關鍵字,所以這不起作用

SELECT a from, b + c AS sum FROM ...

但是以下兩種方法都可以

SELECT a AS from, b + c AS sum FROM ...
SELECT a "from", b + c AS sum FROM ...

為了最大程度地防止將來新增關鍵字的可能性,建議您始終編寫 AS 或使用雙引號引住輸出欄位名稱。

注意

此處輸出欄位的命名與在 FROM 子句中完成的命名不同(請參閱第 7.2.1.2 節)。可以多次重新命名同一個欄位,但是選擇列表中指定的名稱將會被傳遞下去。

7.3.3. DISTINCT #

在選取清單處理完畢後,您可以選擇性地對結果表進行重複列的消除。DISTINCT 關鍵字直接寫在 SELECT 之後,用於指定此行為。

SELECT DISTINCT select_list ...

(您可以使用 ALL 關鍵字來代替 DISTINCT,以指定保留所有列的預設行為。)

顯然地,如果兩列在至少一個欄位值上有所不同,則它們被認為是不同的。 在此比較中,Null 值被視為相等。

或者,可以使用任意表達式來決定哪些列應被視為不同。

SELECT DISTINCT ON (expression [, expression ...]) select_list ...

這裡,expression 是一個任意值表達式,會針對所有列進行評估。 所有表達式都相等的列的集合被認為是重複的,並且僅保留集合中的第一列在輸出中。 請注意,除非查詢已按足夠的欄位排序以保證到達 DISTINCT 過濾器的列的唯一順序,否則集合的「第一列」是無法預測的。(DISTINCT ON 處理發生在 ORDER BY 排序之後。)

DISTINCT ON 子句不是 SQL 標準的一部分,有時被認為是不好的風格,因為它的結果可能具有不確定的性質。 通過明智地使用 GROUP BYFROM 中的子查詢,可以避免這種結構,但它通常是最方便的替代方案。

提交更正

如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步說明的地方,請使用此表單回報文件問題。