操作符的优先级和关联性是写入分析器中的硬代码. 大多数操作符都有相同的优先级并且都是左关联的. 这种情况可能会有不那么直观的行为;比如,布尔操作符 "<" 和 ">" 和布尔操作符 "<=" 和 ">=" 之间有着不同的优先级.同样,当你把双目和单目操作符组合使用的时候, 有时候也需要加圆括弧.比如
SELECT 5 ! - 6;will be parsed as
SELECT 5 ! (- 6);因为分析器不知道 ! 定义成了前缀操作符, 而不是中缀操作符. (-- 知道的时候只能是太晚了 --) 要在本例中获得你需要的特性,你要写成
SELECT (5 !) - 6;这是我们为扩展性付出的代价.
Table 1-1. 操作符优先级(递减)
操作符/元素 | 关联性 | 描述 |
---|---|---|
:: | 左 | Postgres-风格类型转换 |
[ ] | 左 | 数组元素选则 |
. | 左 | 表/字段名字分隔符 |
- | 右 | 单目负号 |
^ | 左 | 幂操作 |
* / % | 左 | 乘,除,模 |
+ - | 左 | 加,减 |
IS | 测试是否 TRUE,FALSE,NULL | |
ISNULL | 测试是否为 NULL | |
NOTNULL | 测试是否为 NOT NULL | |
(任何其它的) | 左 | 所有其它的本地和用户定义操作符 |
IN | 设置成员 | |
BETWEEN | 包含 | |
OVERLAPS | 时间间隔重叠 | |
LIKE ILIKE | 字符串模式匹配 | |
< > | 小于,大于 | |
= | 右 | 等于,赋值 |
NOT | 右 | 逻辑反 |
AND | 左 | 逻辑与 |
OR | 左 | 逻辑或 |
请注意操作符优先级也适用于和上面提到的同名的内建操作符用户定义操作符. 比如,如果你为一些客户数据类型定义一个 “+” 操作符, 那么它和内建的 “+” 操作符有同样的优先级,不管你干了什么.