值表达式用在各种语法环境中,比如在 SELECT 命令的目标列表中,在 INSERT 或 UPDATE 中用做新的列值,或者在许多命令中的 搜索条件中使用. 我们有时候把值表达式的结果叫做标量, 以便与一个表表达式的结果相区别(是一个表).因此值表达式也叫做 标量表达式(或者更简单的 表达式).表达式语法允许对来自基本部分的 数值进行算术,逻辑,集合,和其它操作的运算.
值表达式是下列内容之一:
一个常量或者文本值;参阅 Section 1.1.2.
一个字段引用
一个操作符调用:
expression operator expression (双目中缀操作符) |
operator expression (单目前缀操作符) |
expression operator (单目后缀操作符) |
( expression )圆括弧用于给子表达式分组和覆盖优先级.
一个位置参数引用,在函数声明体中.
一个函数调用.
一个聚集表达式.
一个标量子查询.这是一个在圆括弧里的普通 SELECT ,它返回一个只有一个字段的行. 在值表达式的环境里使用返回超过一行或多于一个字段的子查询是错误的.
除了这个列表以外,还有许多构造可以归类为表达式,但是不遵循任何 通用的语法规则. 它们通常有函数或操作符的语义,并且在 Chapter 4 里合适的位置描述. 一个例子是 IS NULL 子句.
我们已经在 Section 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 将被第一个函数的参数代替.
函数调用的语法是合法函数名字(受标识符语法规则的约束 Section 1.1.1),后面跟着在圆括弧里 的它的参数列表:
function ([expression [, expression ... ]] )
比如,下面的代码计算 2 的平方根:
sqrt(2)
内建函数的列表在 Chapter 4 里. 其它函数可以由用户添加.
一个聚集表达式代表一个聚集函数对 一个查询选出的行的处理.一个聚集函数把多个输入缩减为一个输出值, 比如给输入求和或平均.一个聚集表达式的语法是下列之一:
aggregate_name (expression) |
aggregate_name (ALL expression) |
aggregate_name (DISTINCT expression) |
aggregate_name ( * ) |
第一种形式的聚集表达式为所有表达式生成非空值的输入行调用聚集. (实际上,是否忽略空值由聚集函数决定 --- 但是所有标准的聚集 函数都忽略它们.) 第二种形式和第一种一样,因为 ALL 是缺省值.第三种形式为所有输入行里找到 表达式的所有唯一的非空值调用聚集. 最后一种形式为每个输入行(不管是空还是非空)调用一次聚集; 因为没有声明特定的输入值.通常它只是对 count() 聚集函数有用.
比如,count(*) 生成输入行的总数; count(f1) 生成 f1 为非空的 输入行数;count(distinct f1) 生成 f1 唯一非空的行数.
预定义的聚集函数在 Section 4.12 里描述. 其它聚集函数可以由用户增加.