PostgreSQL7.0手册-用户手册-4. 操作符

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 13:41:23
第四章. 操作符
内容 
语法优先级 
通用操作符 
数字操作符 
几何操作符 
时间间隔操作符 
IP V4 CIDR 操作符 
IP V4 INET 操作符 



描述 Postgres 内建的可用操作符.
Postgres 提供大量的内建的用于系统类型的操作符.这些操作符在系统表 pg_operator 中定义.在 pg_operator 里的每一个入口/记录都包括操作符实现过程名和输入输出类型的表OID . 
要想了解所有"" -字符串连接操作符的所有变种,使用下面命令: 

    SELECT oprleft, oprright, oprresult, oprcode
    FROM pg_operator WHERE oprname = '';

oprleftoprrightoprresultoprcode
-------+--------+---------+-------
     25      25       25textcat
   1042    1042     1042textcat
   1043    1043     1043textcat
(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 

--------------------------------------------------------------------------------

Tags:

作者:佚名
分享到: 微信 更多