# 价值观

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 ]

# 描述

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

当指定多行时,所有行必须具有相同数量的元素。结果表的列的数据类型是通过组合出现在该列中的表达式的显式或推断类型来确定的,使用与联盟(看第 10.5 节)。

在更大的命令中,价值观在语法上允许的任何地方选择是。因为它被当作一个选择根据语法,可以使用订购方式,限制(或等效地先取), 和抵消带有 a 的子句价值观命令。

# 参数

表达

要在结果表(行集)中的指定位置计算和插入的常量或表达式。在一个价值观出现在顶层的列表插入, 一个*表达*可以替换为默认指示应插入目标列的默认值。默认时不能使用价值观出现在其他上下文中。

排序表达式

一个表达式或整数常量,指示如何对结果行进行排序。这个表达式可以引用价值观结果为第 1 列,第 2 列等。有关详细信息,请参阅ORDER BY 条款在里面选择文档。

操作员

排序运算符。详情见ORDER BY 条款在里面选择文档。

数数

要返回的最大行数。详情见限制条款在里面选择文档。

开始

在开始返回行之前要跳过的行数。详情见限制条款在里面选择文档。

# 笔记

价值观应避免包含大量行的列表,因为您可能会遇到内存不足故障或性能不佳。价值观出现在插入是一种特殊情况(因为所需的列类型从插入的目标表,不需要通过扫描来推断价值观list),因此它可以处理比其他情况下实际更大的列表。

# 例子

一个光秃秃的价值观命令:

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

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

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

更常见的是,价值观在较大的 SQL 命令中使用。最常见的用途是在插入

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

在上下文中插入,一个条目价值观列表可以是默认表示此处应使用列默认值而不是指定值:

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

价值观也可以用在一个子选择可以写成,例如条款:

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;

请注意,一个作为子句是必需的价值观用于一个子句,就像对于选择.不需要作为子句为所有列指定名称,但最好这样做。(默认的列名价值观第 1 列,第 2 列等在 PostgreSQL 中,但这些名称在其他数据库系统中可能不同。)

什么时候价值观用于插入,这些值都会自动强制转换为相应目标列的数据类型。在其他上下文中使用它时,可能需要指定正确的数据类型。如果条目都是引用的文字常量,则强制第一个足以确定所有的假定类型:

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

# 提示

对于简单的测试,最好依靠标量列表的形式而不是写一个价值观如上图查询。标量列表方法需要更少的编写并且通常更有效。

# 兼容性

价值观符合 SQL 标准。限制抵消是 PostgreSQL 扩展;另见下选择.

# 也可以看看

插入,选择