PostgreSQL 8.2.3 中文文档
后退快退快进前进

VALUES

名称

VALUES -- 计算一个或一组行

语法

VALUES ( expression [, ...] ) [, ...]
    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start ]

描述

VALUES 根据给定的值表达式计算一个或一组行的值。它通常用于在一个较大的命令内生成一个"常数表",当同时它也可以用于自身。

如果指定了多行,那么每一行都必须拥有相同的元素个数。结果表字段的数据类型将根据表达式的明确或隐含的数据类型确定,使用的规则与 UNION(节10.5)相同。

在大命令里面,VALUES 允许出现在任何 SELECT 可以出现的地方。因为它在语法上非常类似于 SELECT ,可以在 VALUES 命令中使用 ORDER BY, LIMIT, OFFSET 子句。

参数

expression

用于插入结果表指定地点的常量或者表达式。在一个出现在 INSERT 顶层的 VALUES 列表中,expression 可以被 DEFAULT 替换以表示插入目的字段的缺省值。除此以外,当 VALUES 出现在其他场合的时候是不能使用 DEFAULT 的。

sort_expression

一个表示如何排序结果行的表达式或者整数常量。这个表达式可以按照 column1, column2 等等引用 VALUES 的结果列。更多细节参见 ORDER BY 子句

operator

一个排序操作符。更多细节参见 ORDER BY 子句

count

返回的最大行数。更多细节参见 LIMIT 子句

start

在开始返回行之前跳过的行数。更多细节参见 LIMIT 子句

注意

应当避免使用 VALUES 返回数量非常大的结果行,否则可能会遭遇内存耗尽或者性能低下。出现在 INSERT 中的 VALUES 是一个特殊情况,因为目标字段类型可以从 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 标准,此外,LIMITOFFSET 是 PostgreSQL 扩展。

又见

INSERT, SELECT

后退首页前进
VACUUM上一级PostgreSQL 客户端应用程序