PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

VALUES

VALUES — 计算一个行集合

Synopsis

VALUES ( expression [, ...] ) [, ...]
    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]

描述

VALUES 计算由值表达式指定的一行值或者一组行值。它最常被用来在一个更大的命令中生成一个“常量表”,但它也可以单独使用。

当指定了多于一行时,所有的行都必须拥有相同数量的元素。结果表的列的数据类型通过组合出现在该列中的表达式的显式或推断类型来确定,使用的规则与 UNION 的规则相同(参见 Section 10.5)。

在更大的命令中,语法上允许 VALUES 出现在任何允许 SELECT 的地方。由于文法把它当作一个 SELECT 来对待,因此可以将 ORDER BY、LIMIT(或者等价的 FETCH FIRST)和 OFFSET 子句用在一个 VALUES 命令上。

参数

expression

要计算并插入到结果表(行的集合)中所指示位置的一个常量或者表达式。在一个 VALUES 列表出现在 INSERT 顶层的情况下,expression 可以被 DEFAULT 替换,以表示应插入目标列的默认值。DEFAULT 在 VALUES 出现于其他上下文中时不能被使用。

sort_expression

一个指示如何对结果行排序的表达式或整数常量。这个表达式可以把 VALUES 结果的列引用为 column1、column2 等。更多细节请参见 ORDER BY Clause(位于 SELECT 文档中)。

operator

一个排序操作符。细节请参见 ORDER BY Clause(位于 SELECT 文档中)。

count

要返回的行的最大数量。细节请参见 LIMIT Clause(位于 SELECT 文档中)。

start

在开始返回行之前要跳过的行数。细节请参见 LIMIT Clause(位于 SELECT 文档中)。

注记

应该避免拥有非常多行的 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;

注意,AS 子句是必需的,此时 VALUES 用在一个 FROM 子句中,就像 SELECT 的情况一样。并不要求 AS 子句为所有的列都指定名称,但这样做是一个好习惯。 (VALUES 的默认列名是 column1、column2 等,在 PostgreSQL 中是这样,但在其他数据库系统中这些名称可能不同。)

当 VALUES 被用在 INSERT 中时,所有的值都会被自动强制转换成相应目标列的数据类型。当它被用在其他上下文中时,可能需要指定正确的数据类型。如果所有的项都是加了引号的字面常量,那么只对第一个进行强制转换就足以确定所有项被假定的类型:

SELECT * FROM machines
WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));

Tip

对于简单的 IN 测试,最好依赖 标量列表 形式的 IN,而不是像上面展示的那样编写一个 VALUES 查询。标量列表方法需要写的代码更少,并且通常效率更高。

兼容性

VALUES 符合 SQL 标准。LIMIT 和 OFFSET 是 PostgreSQL 的扩展;另请参见 SELECT 下的内容。

另请参阅

INSERT, SELECT