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 下的内容。