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