pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
Postgres 在系统类型上提供大量内建运算符。这些运算符声明在系统目录 pg_operator 中。pg_operator 中的每个条目都包括实现该运算符的过程的名称以及输入和输出类型的类 OIDs。
要查看 “||” 字符串连接运算符的所有变体,可以试试
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)
表 9.1. Postgres 运算符
| 运算符 | 描述 | 用法 |
|---|---|---|
| < | 小于? | 1 < 2 |
| <= | 小于等于? | 1 <= 2 |
| <> | 不等于? | 1 <> 2 |
| = | 等于? | 1 = 1 |
| > | 大于? | 2 > 1 |
| >= | 大于等于? | 2 >= 1 |
| || | 连接字符串 | 'Postgre' || 'SQL' |
| !!= | NOT IN | 3 !!= i |
| ~~ | LIKE | 'scrappy,marc,hermit' ~~ '%scrappy%' |
| !~~ | NOT LIKE | 'bruce' !~~ '%al%' |
| ~ | 匹配(正则),区分大小写 | 'thomas' ~ '*.thomas*.' |
| ~* | 匹配(正则),不区分大小写 | 'thomas' ~* '*.Thomas*.' |
| !~ | 不匹配(正则),区分大小写 | 'thomas' !~ '*.Thomas*.' |
| !~* | 不匹配(正则),不区分大小写 | 'thomas' !~ '*.vadim*.' |
表 9.2. Postgres 数值运算符
| 运算符 | 描述 | 用法 |
|---|---|---|
| ! | 阶乘 | 3 ! |
| !! | 阶乘(左运算符) | !! 3 |
| % | 取模 | 5 % 4 |
| % | 截断 | % 4.5 |
| * | 乘法 | 2 * 3 |
| + | 加法 | 2 + 3 |
| - | 减法 | 2 - 3 |
| / | 除法 | 4 / 2 |
| : | 自然指数 | : 3.0 |
| ; | 自然对数 | (; 5.0) |
| @ | 绝对值 | @ -5.0 |
| ^ | 幂运算 | 2.0 ^ 3.0 |
| |/ | 平方根 | |/ 25.0 |
| ||/ | 立方根 | ||/ 27.0 |
表 9.3. 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 是最初的日期时间类型留下的遗产,不像更现代的类型那样受到良好支持。此类型有几个运算符。
表 9.4. Postgres 时间区间运算符
| 运算符 | 描述 | 用法 |
|---|---|---|
| #< | 区间小于? | |
| #<= | 区间小于等于? | |
| #<> | 区间不等于? | |
| #= | 区间等于? | |
| #> | 区间大于? | |
| #>= | 区间大于等于? | |
| <#> | 转换为时间区间 | |
| << | 区间小于? | |
| | | 区间的起点 | |
| ~= | 等于 | |
| <?> | 时间在区间内? |
用户可以用运算符名称调用运算符,例如:
select * from emp where salary < 40000;
或者,用户也可以直接调用实现这些运算符的函数。此时上面的查询将写作:
select * from emp where int4lt(salary, 40000);
psql 有一个 \dd 命令用于显示这些运算符。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。