pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
值表达式被用于各种各样的环境中,例如在SELECT命令的目标列表中,作为INSERT或UPDATE中的新列值,或者作为若干命令中的搜索条件。为了与表表达式(其结果是一张表)区分开来,值表达式的结果有时被称为标量。因此,值表达式也称为标量表达式(甚至简称为表达式)。表达式语法允许使用算术、逻辑、集合以及其他操作,从基本部分计算出值。
一个值表达式是下列之一:
一个常量或字面值;见第 1.1.2 节。
一个列引用
一次操作符调用:
expression operator expression(二元中缀操作符) |
operator expression(一元前缀操作符) |
expression operator(一元后缀操作符) |
其中 operator 遵循 第 1.1.3 节 的语法规则或者是 词元 AND、OR 和 NOT 之一。具体存在哪些操作符以及它们是一元还是二元,取决于系统或用户定义了哪些操作符。第 4 章 描述了内置操作符。
( expression )
圆括号被用来对子表达式分组并覆盖优先级。
在一个函数声明体中的一个位置参数引用
一个函数调用
一个聚合表达式
一个标量子查询。这是一个放在圆括号中的普通 SELECT,它恰好返回一行一列。在一个值表达式的上下文中使用一个返回多于一行或多于一列的子查询是错误的。
在这个列表之外,还有一些结构可以被分类为一个表达式,但是它们不遵循任何一般语法规则。这些通常具有一个函数或操作符的语义并且在第 4 章中的合适位置解释。一个示例是IS NULL子句。
我们已经在第 1.1.2 节中讨论过常量。下面的小节会讨论剩下的选项。
一个列可以以下面的形式被引用:
correlation.columnname`['subscript`]'
correlation 是一个表的名字、一个由 FROM 子句定义的表别名,或者是 关键词 NEW 或 OLD 之一。 (NEW 和 OLD 只能出现在规则的动作部分, 而其他关联名称可以用在任何 SQL 语句中。) 如果该列名在当前查询所用的所有表中都是唯一的,则关联名称可以省略。如果 column 是一个数组类型,那么可选的 subscript 选择该数组中的一个元素。如果没有提供下标,那么选中整个数组。关于每种情况下允许的语法,请参阅PostgreSQL 参考手册中对相应命令的描述。
位置参数引用用来表示 SQL 函数中的一个参数。这典型地用在 SQL 函数定义语句中。参数的形式是:
$number
例如,考虑一个函数dept的定义:
CREATE FUNCTION dept (text) RETURNS dept AS 'select * from dept where name = $1' LANGUAGE 'sql';
这里$1引用函数被调用时第一个函数参数的值。
函数调用的语法是:函数名(须遵循第 1.1.1 节中标识符的语法规则)后跟一组放在圆括号内的参数列表:
function([expression[,expression... ]] )
例如,下面会计算 2 的平方根:
sqrt(2)
内置函数的列表在第 4 章中。其他函数可以由用户增加。
一个聚合表达式表示将聚合函数应用于查询选中的各行。聚合函数将多个输入归约为单个输出值,例如输入的和或平均值。聚合表达式的语法可以是以下形式之一:
aggregate_name (expression) |
aggregate_name (ALL expression) |
aggregate_name (DISTINCT expression) |
aggregate_name ( * ) |
其中,aggregate_name 是先前定义的聚合,而 expression 是任何本身不包含聚合表达式的表达式。
第一种形式的聚合表达式为所有使给定表达式产生非空值的输入行调用聚合。(实际上,是否忽略空值取决于聚合函数本身——但所有标准聚合都会忽略空值。)第二种形式和第一种相同,因为ALL是默认选项。第三种形式为输入行中表达式的所有非空可区分值调用聚合。最后一种形式为每一个输入行调用一次聚合而不管值是空还是非空;因为没有指定特定的输入值,它通常只对count()聚合函数有用。
例如,count(*)得到输入行的总数。count(f1)得到输入行中f1为非空的数量;而count(distinct f1)得到f1的非空可区分值的数量。
预定义的聚合函数在第 4.12 节中描述。其他聚合函数可以由用户增加。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。