1.3. 值表达式

值表达式用在各种语法环境中,比如在 SELECT 命令的目标列表中,在 INSERTUPDATE 中用做新的列值,或者在许多命令中的 搜索条件中使用. 我们有时候把值表达式的结果叫做标量, 以便与一个表表达式的结果相区别(是一个表).因此值表达式也叫做 标量表达式(或者更简单的 表达式).表达式语法允许对来自基本部分的 数值进行算术,逻辑,集合,和其它操作的运算.

值表达式是下列内容之一:

除了这个列表以外,还有许多构造可以归类为表达式,但是不遵循任何 通用的语法规则. 它们通常有函数或操作符的语义,并且在 Chapter 4 里合适的位置描述. 一个例子是 IS NULL 子句.

我们已经在 Section 1.1.2 里有讨论过的 内容了.下面的节讨论剩下的选项.

1.3.1. 字段引用

一个字段可以是下面形式的引用:

correlation.columnname `['subscript`]'
correlation 要么是一个表的名字, 要么是用 FROM 子句这样的方法定义的表的别名,或者是关键字 NEWOLD. (NEW 和 OLD 只能出现在一条规则的动作部分, 而其他相关的名字可以用于任意 SQL 语句中.) 如果在当前查询中所使用的所有表中,该字段名字是唯一的, 那么这个相关名字就可以省略.如果 column 是一个数组类型,那么可选的 subscript 选择该数组中指定的元素. 如果没有提供脚标,那么选出整个数组.请参考 PostgreSQL 参考手册 里描述的相关命令获取你在不同场合可以用的语法.

1.3.2. 位置参数

位置参数引用用于标识一个 SQL 函数里的一个参数. 通常它用于 SQL 函数定义语句.一个参数的形式如下:

$number

比如,看看一个函数 dept 的定义, 如下

CREATE FUNCTION dept (text) RETURNS dept
  AS 'select * from dept where name = $1'
  LANGUAGE 'sql';
在函数被调用的时候这里的 $1 将被第一个函数的参数代替.

1.3.3. 函数调用

函数调用的语法是合法函数名字(受标识符语法规则的约束 Section 1.1.1),后面跟着在圆括弧里 的它的参数列表:

function ([expression [, expression ... ]] )

比如,下面的代码计算 2 的平方根:

sqrt(2)

内建函数的列表在 Chapter 4 里. 其它函数可以由用户添加.

1.3.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 唯一非空的行数.

预定义的聚集函数在 Section 4.12 里描述. 其它聚集函数可以由用户增加.