历史版本。 PostgreSQL 7.1 已结束支持。 请参阅 当前版本手册.
1.4. 词法优先级 #
操作符的优先级和结合性是固定写在解析器中的。大多数操作符具有相同的优先级,并且是左结合的。这可能导致不直观的行为;例如,布尔操作符"<"和">"与布尔操作符"<="和">="的优先级不同。此外,在组合使用二元和一元操作符时,有时需要添加圆括号。例如:
SELECT 5 ! - 6;
将被解析为
SELECT 5 ! (- 6);
因为解析器并不知道 — 等到知道时已经太迟了 — ! 被定义为后缀操作符,而不是中缀操作符。要在这种情况下得到所需的行为,必须写成:
SELECT (5 !) - 6;
这是为可扩展性付出的代价。
表 1.1. 操作符优先级(递减)
| 操作符/元素 | 结合性 | 描述 |
|---|---|---|
:: | 左 | Postgres-风格的类型转换 |
[ ] | 左 | 数组元素选择 |
. | 左 | 表/列名分隔符 |
- | 右 | 一元负号 |
^ | 左 | 求幂 |
* / % | 左 | 乘、除、取模 |
+ - | 左 | 加、减 |
IS | 测试 TRUE、FALSE、NULL | |
ISNULL | 空值测试 | |
NOTNULL | 非空测试 | |
| (任意其他) | 左 | 所有其他内建和用户定义的操作符 |
IN | 集合成员关系 | |
BETWEEN | 范围包含 | |
OVERLAPS | 时间区间重叠 | |
LIKE ILIKE | 字符串模式匹配 | |
< > | 小于、大于 | |
= | 右 | 相等、赋值 |
NOT | 右 | 逻辑否定 |
AND | 左 | 逻辑合取 |
OR | 左 | 逻辑析取 |
注意,这些操作符优先级规则也适用于名称与上述内置操作符相同的用户定义操作符。例如,如果你为某种自定义数据类型定义了一个 “+” 操作符,那么无论你的操作符做什么,它都将具有与内置 “+” 操作符相同的优先级。