Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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;

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

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

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

提示

对于简单的 IN 测试,最好依赖于 INlist-of-scalars 形式,而不是像上文所示的那样编写 VALUES 查询。使用标量列表的方法需要更少的编写,并且通常更有效。

兼容性

VALUES 符合 SQL 标准。LIMITOFFSETPostgreSQL 扩展;另请参阅 SELECT 下的内容。

另请参见

INSERT, SELECT