VALUES — 計算一組行
VALUES (expression
[, ...] ) [, ...] [ ORDER BYsort_expression
[ ASC | DESC | USINGoperator
] [, ...] ] [ LIMIT {count
| ALL } ] [ OFFSETstart
[ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [count
] { ROW | ROWS } ONLY ]
VALUES
計算由值表示式指定的一行值或一組行值。它最常用於在較大的命令中生成一個“常量表”,但也可以單獨使用。
當指定多於一行時,所有行必須具有相同數量的元素。結果表的列的資料型別透過結合該列中出現的表示式的顯式或推斷型別來確定,使用與 UNION
相同的規則(參見 第 10.5 節)。
在較大的命令中,VALUES
在語法上允許出現在 SELECT
允許的任何地方。因為語法上將其視為 SELECT
,所以可以為 VALUES
命令使用 ORDER BY
、LIMIT
(或等效的 FETCH FIRST
)和 OFFSET
子句。
expression
要在結果表中(行集)的指定位置計算並插入的常量或表示式。在 INSERT
的頂層出現的 VALUES
列表中,expression
可以被 DEFAULT
替換,表示應插入目標列的預設值。DEFAULT
不能在 VALUES
出現在其他上下文時使用。
sort_expression
指示如何排序結果行的表示式或整數常量。此表示式可以引用 VALUES
結果的列,名稱為 column1
、column2
等。更多詳細資訊請參見 ORDER BY 子句,在 SELECT 文件中。
operator
排序運算子。有關詳細資訊,請參見 ORDER BY 子句,在 SELECT 文件中。
count
start
應避免行數非常多的 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
的預設列名稱是 column1
、column2
等,但在其他資料庫系統中,這些名稱可能不同。)
當 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 標準。LIMIT
和 OFFSET
是 PostgreSQL 擴充套件;另請參見 SELECT 下的內容。
如果您在文件中看到任何不正確、與您對特定功能的經驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。