2024年9月26日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

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列表中,expression 可以替换为DEFAULT以指示应插入目标列的默认值。DEFAULT不能在VALUES出现在其他上下文中时使用。

sort_expression

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

operator

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

count

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

start

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

注释

应避免使用具有大量行的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子句为所有列指定名称,但最好这样做。(VALUES的默认列名为column1column2等,在PostgreSQL中,但在其他数据库系统中这些名称可能不同。)

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 标准。LIMITOFFSETPostgreSQL扩展;另请参见SELECT

另请参见

INSERTSELECT

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步说明的内容,请使用此表单报告文档问题。