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

VALUES

VALUES — 計算一組列

概要

VALUES ( expression [, ...] ) [, ...]
    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]

描述

VALUES 計算由值表達式指定的列值或一組列值。它最常用於在較大的命令中產生常數表,但它也可以單獨使用。

當指定多個列時,所有列必須具有相同數量的元素。結果表的列的資料類型是通過組合出現在該列中的表達式的顯式或推斷類型來確定的,使用的規則與 UNION 相同(請參閱第 10.5 節)。

在較大的命令中,語法上允許在任何可以使用 SELECT 的地方使用 VALUES。因為它在語法上被視為 SELECT,所以可以使用 ORDER BYLIMIT (或等效的 FETCH FIRST) 和 OFFSET 子句與 VALUES 命令。

參數

expression

一個常數或表達式,用於計算並插入到結果表(列集合)中指定的位置。 在出現在 INSERT 最上層的 VALUES 列表中,expression 可以替換為 DEFAULT,以表示應插入目標列的預設值。 當 VALUES 出現在其他上下文中時,不能使用 DEFAULT

sort_expression

一個表達式或整數常數,指示如何對結果列進行排序。 此表達式可以將 VALUES 結果的列引用為 column1column2 等。 有關更多詳細信息,請參閱 ORDER BY 子句中的 SELECT 文件。

operator

排序運算符。 有關詳細信息,請參閱 ORDER BY 子句中的 SELECT 文件。

count

要返回的最大列數。 有關詳細信息,請參閱 LIMIT 子句中的 SELECT 文件。

start

在開始返回列之前要跳過的列數。 有關詳細信息,請參閱 LIMIT 子句中的 SELECT 文件。

備註

應避免使用具有大量列的 VALUES 列表,因為您可能會遇到記憶體不足的失敗或效能不佳的問題。VALUES 出現在 INSERT 中是一種特殊情況(因為所需的列類型是從 INSERT 的目標表已知的,並且不需要通過掃描 VALUES 列表來推斷),因此它可以處理比在其他上下文中實際使用的更大的列表。

範例

一個空的 VALUES 命令

VALUES (1, 'one'), (2, 'two'), (3, 'three');

這將返回一個包含兩列和三列的表。 它實際上等同於

SELECT 1 AS column1, 'one' AS column2
UNION ALL
SELECT 2, 'two'
UNION ALL
SELECT 3, 'three';

通常,VALUES 用於較大的 SQL 命令中。 最常見的用法是在 INSERT

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

INSERT 的上下文中,VALUES 列表的條目可以是 DEFAULT,以表示此處應使用列的預設值,而不是指定值

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
    ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);

VALUES 也可以在可以編寫子-SELECT 的地方使用,例如在 FROM 子句中

SELECT f.*
  FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind)
  WHERE f.studio = t.studio AND f.kind = t.kind;

UPDATE employees SET salary = salary * v.increase
  FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase)
  WHERE employees.depno = v.depno AND employees.sales >= v.target;

請注意,當 VALUES 用於 FROM 子句中時,需要 AS 子句,就像 SELECT 一樣。 不需要 AS 子句指定所有列的名稱,但最好這樣做。 (在 PostgreSQL 中,VALUES 的預設列名是 column1column2 等,但在其他資料庫系統中,這些名稱可能不同。)

VALUES 用於 INSERT 時,所有值都會自動強制轉換為相應目標列的資料類型。 當它用於其他上下文中時,可能需要指定正確的資料類型。 如果條目都是帶引號的文字常數,則強制轉換第一個條目足以確定所有條目的假定類型

SELECT * FROM machines
WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));

提示

對於簡單的 IN 測試,最好使用 純量列表形式的 IN,而不是像上面所示那樣撰寫 VALUES 查詢。純量列表方法需要的程式碼較少,而且通常更有效率。

相容性

VALUES 符合 SQL 標準。LIMITOFFSETPostgreSQL 的擴充功能;另請參閱 SELECT

另請參閱

INSERT, SELECT

提交更正

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