值表达式
值表达式是查询中用于计算、转换和引用数据的核心组成部分。理解这些表达式的用法是编写灵活、高效 SQL 查询的关键。
本文介绍了多种表达式类型,包括列引用、位置参数、数组和行构造器、函数调用以及类型转换。每种表达式类型在查询结果中的数据处理和呈现方式中都扮演着特定角色。
列引用
列引用的语法如下:
<correlation>.<columnname>
其中 <correlation>
是表名(可以带有 schema 名)或在 FROM
子句中定义的表别名,也可以是关键字 NEW
或 OLD
。NEW
和 OLD
只能出现在重写规则中,其他引用名可以在任意 SQL 语句中使用。如果列名在查询中是唯一的,可以省略 <correlation>
前缀。
位置参数
位置参数是 SQL 语句或函数的参数,通过参数在参数列表中的位置进行引用。例如,$1
表示第一个参数,$2
表示第二个参数,依此类推。位置参数的值来自 SQL 外部传入的参数,或是调用 SQL 函数时传入的实参。一些客户端库支持将数据值与 SQL 命令分开传入,这种情况下参数引用的是这些“脱离 SQL 文本”的数据值。参数引用的语法如下:
$number
例如:
CREATE FUNCTION dept(text) RETURNS dept
AS $$ SELECT * FROM dept WHERE name = $1 $$
LANGUAGE SQL;
这里的 $1
表示函数被调用时传入的第一个参数值。
下标引用(Subscripts)
如果某个表达式的结果是数组类型的值,可以通过以下方式获取数组中指定的元素:
<expression>[<subscript>]
也可以提取多个相邻的元素(称为数组切片):
<expression>[<lower_subscript>:<upper_subscript>]
每个下标都是一个表达式,返回一个整数值。
数组表达式通常必须用括号括起来,但如果要下标引用的是列引用或位置参数,可以省略括号。对于多维数组,可以使用多个下标进行连续访问,例如(包括括号):
mytable.arraycolumn[4]
mytable.two_d_column[17][34]
$1[10:42]
(arrayfunction(a,b))[42]
字段选择(Field selection)
如果一个表达式返回的是复合类型(行类型)的值,可以通过以下方式提取某个字段:
<expression>.<fieldname>
通常,行表达式需要用括号括起来。但如果要提取字段的是表引用或位置参数,则可以省略括号。例如:
mytable.mycolumn
$1.somecolumn
(rowfunction(a,b)).col3
带限定名的列引用其实就是字段选择语法的一种特殊形式。
运算符调用(Operator invocations)
运算符调用支持以下几种语法:
<expression operator expression> -- 二元中缀运算符
<operator expression> -- 一元前缀运算符
<expression operator> -- 一元后缀运算符
其中 operator
可以是运算符符号、关键字 AND
、OR
或 NOT
,也可以是带 schema 限定的运算符名称,形式如下:
OPERATOR(<schema>.<operatorname>)