VALUES

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# 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`，可以在`VALUES`命令中使用 `ORDER BY`, `LIMIT` (或相等的 `FETCH FIRST`), 和 `OFFSET`子句。

## 参数

`expression`

  用于计算或插入结果表指定地点的常量或者表达式。在一个出现在`INSERT` 顶层的`VALUES`列表中，`expression` 可以被`DEFAULT`替换以表示插入目的字段的缺省值。除此以外， 当`VALUES`出现在其他场合的时候是不能使用`DEFAULT`的。

`sort_expression`

  一个表示如何排序结果行的表达式或者整数常量。这个表达式可以按照`column1`, `column2`等等引用`VALUES`的结果列。更多细节参见 ORDER BY 子句。

`operator`

  一个排序操作符。更多细节参见ORDER BY 子句。

`count`

  返回的最大行数。更多细节参见 LIMIT 子句。

`start`

  在开始返回行之前跳过的行数。更多细节参见LIMIT 子句。

## 注意

应当避免使用`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`子句为每个字段都指定一个别名， 但是这样做是一个好习惯。PostgreSQL中`VALUES` 缺省的字段名是`column1`, `column2`等等， 但这些缺省的名字并不一定与其他数据库系统相同。

当`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 标准，此外，`LIMIT` 和`OFFSET`是PostgreSQL扩展； 又见SELECT。

## 又见

INSERT, SELECT

上一页 | 起始页 | 下一页
VACUUM | 上一级 | PostgreSQL 客户端应用程序