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相同的规则。

在更大型的命令中,VALUES语法可在任何允许SELECT的位置使用。由于语法上将其视为SELECT语句,因此可在VALUES命令中使用ORDER BY、LIMIT(或等效的FETCH FIRST)及OFFSET子句。

参数

  • expression
    • 一个常量或表达式,用于计算并插入到结果表(行集合)的指定位置。在INSERT语句顶级出现的VALUES列表中,表达式可替换为DEFAULT以指示应插入目标列的默认值。当VALUES出现在其他上下文时,不可使用DEFAULT。
  • sort_expression
    • 一个表达式或整数常量,用于指定如何对结果行进行排序。该表达式可将VALUES结果的列表示为column1、column2等形式。更多详情请参阅SELECT参数中的"ORDER BY子句"。
  • operator
    • 排序运算符。更多详情请参阅SELECT参数中的"ORDER BY子句"。
  • LIMIT count
  • OFFSET start
    • 返回的最大行数。更多详情请参阅SELECT参数中的"LIMIT子句"。

注意

应避免使用行数过多的VALUES列表,否则可能导致内存不足错误或性能下降。INSERT语句中的VALUES列表属于特殊情况(因为目标表已知所需列类型,无需通过扫描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 子句不必为所有列指定名称,但这样做是良好的编程习惯。在 Database 数据库中,VALUES 的默认列名为 column1、column2 等,但在其他数据库系统中这些名称可能不同。

当VALUES用于INSERT语句时,所有值都会自动转换为对应目标列的数据类型。在其他上下文中使用时,可能需要显式指定正确数据类型。若所有条目均为带引号的字面常量,则只需对首个条目进行类型转换即可确定所有条目的默认类型:

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

注意!
对于简单的IN测试,采用标量列表形式的IN比编写如上所示的VALUES查询更为可取。标量列表方法不仅代码量更少,通常也更高效。

兼容性

VALUES 符合 SQL 标准。LIMIT 和 OFFSET 是数据库扩展功能;另请参见 SELECT 部分。

另见

INSERT, SELECT