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 文件中。
countstart應避免行數非常多的 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 下的內容。
如果您在文件中看到任何不正確、與您對特定功能的經驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。