VALUES

计算一组行。

概要

  1. VALUES ( expression [, ...] ) [, ...]
  2. [ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...]
  3. ]
  4. [LIMIT { count | ALL } ]
  5. [OFFSET start [ ROW | ROWS ] ]
  6. [FETCH { FIRST | NEXT } [count ] { ROW | ROWS } ONLY ]

描述

VALUES计算值表达式指定的行值或行值集。 它最常用于在较大的命令中生成“常数表”,但可以单独使用。

指定多于一行时,所有行必须具有相同数量的元素。 通过使用与UNION相同的规则, 组合出现在该列中的表达式的显式或推断类型,来确定结果表的列的数据类型。

在较大的命令中,语法上允许SELECT所在的任何位置使用VALUES。 由于语法将其视为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是一种特殊情况(因为所需的列类型是从INSERT的目标表中知道的,不需要通过扫描VALUES列表来推断), 因此它可以处理比其他情况下实际更大的列表。

示例

一条简单的VALUES命令:

  1. VALUES (1, 'one'), (2, 'two'), (3, 'three');

这将返回一个两列三行的表。它实际上等效于:

  1. SELECT 1 AS column1, 'one' AS column2
  2. UNION ALL
  3. SELECT 2, 'two'
  4. UNION ALL
  5. SELECT 3, 'three';

通常,在较大的SQL命令中使用VALUES。 最常见的用法是在INSERT中:

  1. INSERT INTO films (code, title, did, date_prod, kind)
  2. VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

在INSERT的上下文中,VALUES列表的条目可以为DEFAULT, 以指示此处应使用列默认值而不是指定值:

  1. INSERT INTO films VALUES
  2. ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82
  3. minutes'),
  4. ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);

VALUES也可以用于可能写入sub-SELECT的地方,例如在FROM子句中:

  1. SELECT f.* FROM films f, (VALUES('MGM', 'Horror'), ('UA',
  2. 'Sci-Fi')) AS t (studio, kind) WHERE f.studio = t.studio AND
  3. f.kind = t.kind;
  4. UPDATE employees SET salary = salary * v.increase FROM
  5. (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno,
  6. target, increase) WHERE employees.depno = v.depno AND
  7. employees.sales >= v.target;

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

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

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

Note: 对于简单的IN测试, 最好依靠IN的标量列表形式,而不要像上面所示编写VALUES查询。 标量方法列表需要较少的编写,并且通常效率更高。

兼容性

VALUES符合SQL标准。 LIMIT和OFFSET是Greenplum数据库扩展; 另请参见SELECT下的内容。

另见

INSERT , SELECT

Parent topic: SQL Command Reference