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,表示应该插入目标列的默认值。当 VALUES 出现在其他上下文中时,不能使用 DEFAULT。
sort_expression一个表达式或整数常量,指示如何对结果行进行排序。此表达式可以引用 VALUES 结果的列,如 column1、column2 等。有关更多详细信息,请参阅 SELECT 文档中的 ORDER BY 子句。
operator一个排序运算符。有关详细信息,请参阅 SELECT 文档中的 ORDER BY 子句。
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;
请注意,当在 FROM 子句中使用 VALUES 时,需要一个 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'));
VALUES 符合 SQL 标准。 LIMIT 和 OFFSET 是 PostgreSQL 扩展;另请参阅 SELECT。
如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。