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 節)。
在較大的命令中,語法上允許在任何可以使用 SELECT
的地方使用 VALUES
。因為它在語法上被視為 SELECT
,所以可以使用 ORDER BY
、LIMIT
(或等效的 FETCH FIRST
) 和 OFFSET
子句與 VALUES
命令。
expression
一個常數或表達式,用於計算並插入到結果表(列集合)中指定的位置。 在出現在 INSERT
最上層的 VALUES
列表中,expression
可以替換為 DEFAULT
,以表示應插入目標列的預設值。 當 VALUES
出現在其他上下文中時,不能使用 DEFAULT
。
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。
如果您發現文件中的任何內容不正確、與您對特定功能的體驗不符,或需要進一步澄清,請使用此表單回報文件問題。