4.8. 值表达式

值表达式被用于各种各样的环境中,例如在SELECT命令的目标列表中、作为INSERT或UPDATE中的新列值或者若干命令中的搜索条件。为了区别于一个表表达式(是一个表)的结果,一个值表达式的结果有时候被称为一个标量。值表达式因此也被称为标量表达式(或者甚至简称为表达式)。表达式语法允许使用算数、逻辑、集合和其他操作从原始部分计算值。

一个值表达式是下列之一:

  • 一个常量或文字值
  • 一个列引用
  • 在一个函数定义体或预备语句中的一个位置参数引用
  • 一个下标表达式
  • 一个域选择表达式
  • 一个操作符调用
  • 一个函数调用
  • 一个聚集表达式
  • 一个窗口函数调用
  • 一个类型转换
  • 一个排序规则表达式
  • 一个标量子查询
  • 一个数组构造器
  • 一个行构造器
  • 另一个在圆括号(用来分组子表达式以及重载优先级)中的值表达式

在这个列表之外,还有一些结构可以被分类为一个表达式,但是它们不遵循任何一般语法规则。这些通常具有一个函数或操作符的语义并且在第 9 章中的合适位置解释。一个例子是IS NULL子句。

我们已经在 3. 常量 中讨论过常量。下面的小节会讨论剩下的选项。

4.8.1. 列引用

  • 一个列可以以下面的形式被引用:
    correlation.columnname
    

correlation是一个表(有可能以一个模式名限定)的名字,或者是在FROM子句中为一个表定义的别名。如果列名在当前索引所使用的表中都是唯一的,关联名称和分隔用的句点可以被忽略(另见 第七章:查询 )。

4.8.2. 位置参数

一个位置参数引用被用来指示一个由 SQL 语句外部提供的值。参数被用于 SQL 函数定义和预备查询中。某些客户端库还支持独立于 SQL 命令字符串来指定数据值,在这种情况中参数被用来引用那些线外数据值。一个参数引用的形式是:$number

  • 例如,考虑一个函数dept的定义:
    CREATE FUNCTION dept(text) RETURNS dept
        AS $$ SELECT * FROM dept WHERE name = $1 $$
        LANGUAGE SQL;
    
  • 这里$1引用函数被调用时第一个函数参数的值。

8.3. 下标

如果一个表达式得到了一个数组类型的值,那么可以抽取出该数组值的一个特定元素:expression[subscript]

或者抽取出多个相邻元素(一个"数组切片"):expression[lower_subscript:upper_subscript]

(这里,方括号[ ]表示其字面意思)。每一个下标自身是一个表达式,它必须得到一个整数值。通常,数组表达式必须被加上括号,但是当要被加下标的表达式只是一个列引用或位置参数时,括号可以被忽略。还有,当原始数组是多维时,多个下标可以被连接起来。例如:

mytable.arraycolumn[4]
mytable.two_d_column[17][34]
$1[10:42]
(arrayfunction(a,b))[42]

最后一个例子中的圆括号是必需的。

4.8.4. 域选择

如果一个表达式得到一个组合类型(行类型)的值,那么可以抽取该行的指定域expression.fieldname

通常行表达式必须被加上括号,但是当该表达式是仅从一个表引用或位置参数选择时,圆括号可以被忽略。例如:

mytable.mycolumn
$1.somecolumn
(rowfunction(a,b)).col3

(因此,一个被限定的列引用实际上只是域选择语法的一种特例)。一种重要的特例是从一个组合类型的表列中抽取一个域:

(compositecol).somefield
(mytable.compositecol).somefield

这里需要圆括号来显示compositecol是一个列名而不是一个表名,在第二种情况中则是显示mytable是一个表名而不是一个模式名。

在一个选择列表(见 7.3. 选择列表 )中,你可以通过书写.*来请求一个组合值的所有域(compositecol).*

4.8.5. 操作符调用

对于一次操作符调用,有三种可能的语法:

  • expression operator expression(二元中缀操作符)
  • operator expression(一元前缀操作符)
  • expression operator(一元后缀操作符)

其中operator记号遵循 4. 操作符 的语法规则,或者是关键词AND、OR和NOT之一,或者是一个如下形式的受限定操作符名:OPERATOR(schema.operatorname)

4.8.6. 函数调用

  • 一个函数调用的语法是一个函数的名称(可能受限于一个模式名)后面跟上封闭于圆括号中的参数列表:
    function_name ([expression [, expression ... ]] )
    
  • 例如,下面会计算 2 的平方根:sqrt(2)

内建函数的列表在 第九章:函数和操作符 中。其他函数可以由用户增加。参数可以有选择地被附加名称。详见 4.3. 常量

注意: 一个采用单一组合类型参数的函数可以被有选择地称为域选择语法,并且反过来域选择可以被写成函数的风格。也就是说,记号col(table)和table.col是可以互换的。这种行为是非 SQL 标准的但是在PostgreSQL中被提供,因为它允许函数的使用来模拟"计算域"。详见 第 35.4.3 节。