Skip to content

VALUES

VALUES — 计算一组行

语法

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相同的规则(请参见第 10.5 节)。

在更大的命令中,VALUES在语法上允许出现在SELECT所在的任何位置。由于语法将其视为SELECT,因此可以将ORDER BYLIMIT(或等效的FETCH FIRST)和OFFSET子句与VALUES命令一起使用。

参数

expression

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

sort_expression

指示如何对结果行进行排序的表达式或整数常量。此表达式可以引用 VALUES 结果的列,如 column1column2 等。有关更多详细信息,请参阅 ORDER BY 子句 中的 SELECT 文档。

operator

排序运算符。有关详细信息,请参阅 ORDER BY 子句 中的 SELECT 文档。

count

要返回的最大行数。有关详细信息,请参阅 LIMIT 子句 中的 SELECT 文档。

start

在开始返回行之前要跳过的行数。有关详细信息,请参阅 LIMIT 子句 中的 SELECT 文档。

注释

应避免使用包含大量行的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;

请注意,当在FROM子句中使用VALUES时,需要AS子句,就像在SELECT中一样。不需要AS子句为所有列指定名称,但这样做是一个好习惯。(VALUES的默认列名称在PostgreSQL中是column1column2等,但这些名称在其他数据库系统中可能不同。)

当在INSERT中使用VALUES时,值会自动强制转换为相应目标列的数据类型。当在其他上下文中使用它时,可能需要指定正确的数据类型。如果所有条目都是带引号的文字常量,则强制转换第一个条目就足以确定所有条目的假定类型

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扩展;另请参见SELECT下的内容。

另请参见

INSERTSELECT