第四章. 操作符
內容
語法優(yōu)先級
通用操作符
數(shù)字操作符
幾何操作符
時間間隔操作符
IP V4 CIDR 操作符
IP V4 INET 操作符
描述 Postgres 內建的可用操作符.
Postgres 提供大量的內建的用于系統(tǒng)類型的操作符.這些操作符在系統(tǒng)表 pg_operator 中定義.在 pg_operator 里的每一個入口/記錄都包括操作符實現(xiàn)過程名和輸入輸出類型的表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;
當然,用戶可以直接使用操作符的實現(xiàn)函數(shù).這時,上面查詢應該這樣表示:
select * from emp where int4lt(salary, 40000);
psql 有一個命令 (/dd) 可以顯示這些操作符.
語法優(yōu)先級
操作符的優(yōu)先級現(xiàn)在是語法分析器的硬代碼.多數(shù)操作符有相同的優(yōu)先級而且是左關聯(lián)的。這有可能導致不可預見的后果;比如說,布爾操作符 "<" 和 ">" 與 "<=" 和 ">=" 有不一樣的優(yōu)先級.
表 4-1. 操作符順序 (優(yōu)先級降序)
元素 優(yōu)先級 描述
UNION 左 SQL 選擇構造(select construct)
:: Postgres 類型轉換
[ ] 左 數(shù)組分隔符
. 左 表/列分隔符
- 右 負(unary minus )
: 右 冪
| 左 間隔開始(start of interval )
* / % 左 乘,除,模除
+ - 左 加減
IS 測試 TRUE, FALSE, NULL
ISNULL 測試 NULL
NOTNULL 測試 NOT NULL
(所有其他操作符) 本地和用戶定義
IN 設置成員(set membership)
BETWEEN 包含
OVERLAPS 時間間隔重疊
LIKE 字符串模式匹配
< > 布爾不相等
= 右 相等
NOT 右 非
AND 左 邏輯與
OR 左 邏輯或
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
通用操作符
這里列出的操作符是為一些常用數(shù)據(jù)類型定義的,其范圍從數(shù)字類型到日期/時間類型。
表 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%'
~ 匹配 (規(guī)則表達式), 大小寫相關 'thomas' ~ '.*thomas.*'
~* 匹配 (規(guī)則表達式), 大小寫無關 'thomas' ~* '.*Thomas.*'
!~ 不匹配(規(guī)則表達式), 大小寫相關 'thomas' !~ '.*Thomas.*'
!~* 不匹配(規(guī)則表達式), 大小寫無關 'thomas' !~ '.*vadim.*'
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
數(shù)字操作符
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
注意:兩個操作符:":" 和 ";",現(xiàn)在被減少使用,并將在下一個版本刪除。使用對應的函數(shù) 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))'
# 多邊形頂點數(shù) # '((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
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
時間間隔操作符
時間間隔數(shù)據(jù)類型 tinterval 是初期的日期/時間類型的一個遺留,支持得并不象現(xiàn)代的類型那么好.有一些操作符用于這些類型.
表4-5. Postgres 時間間隔操作符
操作符 描述 用法
#< 間隔小于 ?
#<= 間隔小于或等于 ?
#<> 間隔不等于 ?
#= 間隔等于 ?
#> 間隔大于 ?
#>= 間隔大于或等于 ?
<#> 轉換成時間間隔
<< 間隔小于 ?
| 間隔開始
~= 與...相同
> 時間在間隔(時間區(qū)間)內 ?
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
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
--------------------------------------------------------------------------------