第四章. 操作符
内容
语法优先级
通用操作符
数字操作符
几何操作符
时间间隔操作符
IP V4 CIDR 操作符
IP V4 INET 操作符
描述 Postgres 内建的可用操作符.
Postgres 提供大量的内建的用于系统类型的操作符.这些操作符在系统表 pg_operator 中定义.在 pg_operator 里的每一个入口/记录都包括操作符实现过程名和输入输出类型的表OID .
要想了解所有"||" -字符串连接操作符的所有变种,使用下面命令:
SELECT oprleft, oprright, oprresult, oprcode
FROM pg_operator WHERE oprname = '||';
oprleft|oprright|oprresult|oprcode
-------+--------+---------+-------
25| 25| 25|textcat
1042| 1042| 1042|textcat
1043| 1043| 1043|textcat
(3 rows)
用户可以通过使用操作符名来使用操作符,例如:
select * from emp where salary < 40000;
当然,用户可以直接使用操作符的实现函数.这时,上面查询应该这样表示:
select * from emp where int4lt(salary, 40000);
psql 有一个命令 (/dd) 可以显示这些操作符.
语法优先级
操作符的优先级现在是语法分析器的硬代码.多数操作符有相同的优先级而且是左关联的。这有可能导致不可预见的后果;比如说,布尔操作符 "<" 和 ">" 与 "<=" 和 ">=" 有不一样的优先级.
表 4-1. 操作符顺序 (优先级降序)
元素 优先级 描述
UNION 左 SQL 选择构造(select construct)
:: Postgres 类型转换
[ ] 左 数组分隔符
. 左 表/列分隔符
- 右 负(unary minus )
: 右 幂
| 左 间隔开始(start of interval )
* / % 左 乘,除,模除
+ - 左 加减
IS 测试 TRUE, FALSE, NULL
ISNULL 测试 NULL
NOTNULL 测试 NOT NULL
(所有其他操作符) 本地和用户定义
IN 设置成员(set membership)
BETWEEN 包含
OVERLAPS 时间间隔重叠
LIKE 字符串模式匹配
< > 布尔不相等
= 右 相等
NOT 右 非
AND 左 逻辑与
OR 左 逻辑或
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
通用操作符
这里列出的操作符是为一些常用数据类型定义的,其范围从数字类型到日期/时间类型。
表 4-2. Postgres 操作符
操作符 描述 例子
< 小于? 1 < 2
<= 小于或等于? 1 <= 2
<> 不等于? 1 <> 2
= 等于? 1 = 1
> 大于? 2 > 1
>= 大于或等于? 2 >= 1
|| 字符串连接 'Postgre' || 'SQL'
!!= 不在...里 3 !!= i
~~ 像 'scrappy,marc,hermit' ~~ '%scrappy%'
!~~ 不像 'bruce' !~~ '%al%'
~ 匹配 (规则表达式), 大小写相关 'thomas' ~ '.*thomas.*'
~* 匹配 (规则表达式), 大小写无关 'thomas' ~* '.*Thomas.*'
!~ 不匹配(规则表达式), 大小写相关 'thomas' !~ '.*Thomas.*'
!~* 不匹配(规则表达式), 大小写无关 'thomas' !~ '.*vadim.*'
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
数字操作符
Table 4-3. Postgres Numerical Operators
操作符 描述 例子
! 阶乘 3 !
!! 阶乘 (左操作符) !! 3
% 取模 5 % 4
% 取整 % 4.5
* 乘 2 * 3
+ 加 2 + 3
- 减 2 - 3
/ 除 4 / 2
: 自然幂 : 3.0
@ 绝对值 @ -5.0
^ 求幂 2.0 ^ 3.0
|/ 平方根 |/ 25.0
||/ 立方根 ||/ 27.0
注意:两个操作符:":" 和 ";",现在被减少使用,并将在下一个版本删除。使用对应的函数 exp() 和 ln()。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
几何操作符
表 4-4. Postgres 几何操作符
操作符 描述 例子
+ 平移 '((0,0),(1,1))'::box + '(2.0,0)'::point
- 平移 '((0,0),(1,1))'::box - '(2.0,0)'::point
* 伸缩/旋转 '((0,0),(1,1))'::box * '(2.0,0)'::point
/ 伸缩/旋转 '((0,0),(2,2))'::box / '(2.0,0)'::point
# 交 '((1,-1),(-1,1))' # '((1,1),(-1,-1))'
# 多边形顶点数 # '((1,0),(0,1),(-1,0))'
## 最近点 '(0,0)'::point ## '((2,0),(0,2))'::lseg
&& 重叠? '((0,0),(1,1))'::box && '((0,0),(2,2))'::box
&< 左重叠? '((0,0),(1,1))'::box &< '((0,0),(2,2))'::box
&> 右重叠? '((0,0),(3,3))'::box &> '((0,0),(2,2))'::box
<-> 两者间距离 '((0,0),1)'::circle <-> '((5,0),1)'::circle
<< 在左边? '((0,0),1)'::circle << '((5,0),1)'::circle
<^ 低于? '((0,0),1)'::circle <^ '((0,5),1)'::circle
>> 在右边? '((5,0),1)'::circle >> '((0,0),1)'::circle
>^ 高于? '((0,5),1)'::circle >^ '((0,0),1)'::circle
?# 相交或重叠 '((-1,0),(1,0))'::lseg ?# '((-2,-2),(2,2))'::box;
?- 水平? '(1,0)'::point ?- '(0,0)'::point
?-| 垂直? '((0,0),(0,1))'::lseg ?-| '((0,0),(1,0))'::lseg
@-@ 长度或周长 @-@ '((0,0),(1,0))'::path
?| 竖直? '(0,1)'::point ?| '(0,0)'::point
?|| 平行? '((-1,0),(1,0))'::lseg ?|| '((-1,2),(1,2))'::lseg
@ 包含或在...上? '(1,1)'::point @ '((0,0),2)'::circle
@@ ...的中心 @@ '((0,0),10)'::circle
~= 与...相同 '((0,0),(1,1))'::polygon ~= '((1,1),(0,0))'::polygon
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
时间间隔操作符
时间间隔数据类型 tinterval 是初期的日期/时间类型的一个遗留,支持得并不象现代的类型那么好.有一些操作符用于这些类型.
表4-5. Postgres 时间间隔操作符
操作符 描述 用法
#< 间隔小于 ?
#<= 间隔小于或等于 ?
#<> 间隔不等于 ?
#= 间隔等于 ?
#> 间隔大于 ?
#>= 间隔大于或等于 ?
<#> 转换成时间间隔
<< 间隔小于 ?
| 间隔开始
~= 与...相同
> 时间在间隔(时间区间)内 ?
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
IP V4 CIDR 操作符
表 4-6. PostgresIP V4 CIDR 操作符
操作符 描述 用法
< 小于 '192.168.1.5'::cidr < '192.168.1.6'::cidr
<= 小于或等于 '192.168.1.5'::cidr <= '192.168.1.5'::cidr
= 等于 '192.168.1.5'::cidr = '192.168.1.5'::cidr
>= 大于或等于 '192.168.1.5'::cidr >= '192.168.1.5'::cidr
> 大于 '192.168.1.5'::cidr > '192.168.1.4'::cidr
<> 不等于 '192.168.1.5'::cidr <> '192.168.1.4'::cidr
<< 包含于 '192.168.1.5'::cidr << '192.168.1/24'::cidr
<<= 包含于或等于 '192.168.1/24'::cidr <<= '192.168.1/24'::cidr
>> 包含 '192.168.1/24'::cidr >> '192.168.1.5'::cidr
>>= 包含或等于 '192.168.1/24'::cidr >>= '192.168.1/24'::cidr
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
IP V4 INET 操作符
表 4-7. PostgresIP V4 INET 操作符
操作符 描述 用法
< 小于 '192.168.1.5'::inet < '192.168.1.6'::inet
<= 小于活等于 '192.168.1.5'::inet <= '192.168.1.5'::inet
= 等于 '192.168.1.5'::inet = '192.168.1.5'::inet
>= 大于或等于 '192.168.1.5'::inet >= '192.168.1.5'::inet
> 大于 '192.168.1.5'::inet > '192.168.1.4'::inet
<> 不等于 '192.168.1.5'::inet <> '192.168.1.4'::inet
<< 包含于 '192.168.1.5'::inet << '192.168.1/24'::inet
<<= 包含于或等于 '192.168.1/24'::inet <<= '192.168.1/24'::inet
>> 包含 '192.168.1/24'::inet >> '192.168.1.5'::inet
>>= 包含或等于 '192.168.1/24'::inet >>= '192.168.1/24'::inet
--------------------------------------------------------------------------------