PostgreSQL操做符技巧分享

操做符是數據庫具備的運算特性,對文本字符和一些標籤字符的處理,使用操做符能夠簡化SQL代碼,同時也能夠節省開發時間和提升開發效率。數據庫

比較操做符網絡

在PostgreSQL中,全部的數據類型均可以使用比較操做符,比較操做符運算結果返回一個布爾值。即 TRUE 或者 FALSE。比較操做符爲雙目操做符,所以被比較的兩個值的數據類型必須是相同的數據類型或者在彼此之間能夠進行隱式類型轉換。在PostgreSQL中,提供的比較操做符有 > 、< 、<= 、>= 、= 、<> 或者 != 。在 PostgreSQL中,相似 a > b > c的操做是非法的,由於布爾值和數值之間沒法作比較。ide

示例:函數

hrdb=# SELECT 2 > 1 AS result; result -------- t(1 row)
hrdb=# SELECT 'a' = 'a' AS result; result -------- t(1 row)
hrdb=# SELECT 'a' <> 'b' AS result; result -------- t(1 row)
hrdb=# SELECT 'a' != 'b' AS result; result -------- t(1 row)
hrdb=# SELECT '@' > '!' AS result; result -------- t(1 row)
hrdb=# SELECT ascii('@'),ascii('!'); ascii | ascii -------+------- 64 | 33(1 row)
hrdb=# SELECT '@' > 'a' AS result; result -------- f(1 row)
hrdb=# SELECT ascii('@'),ascii('a'); ascii | ascii -------+------- 64 | 97blog

在PostgreSQL中,除了比較的操做符之外,還有比較的謂詞。有以下。排序

hrdb=> --BETWEEN AND謂詞,表示範圍。用法爲某個指定的字符是否在此之間
hrdb=> SELECT 5 BETWEEN 1 AND 6 AS result;
 result
--------
 t
(1 row)ci

hrdb=> --上述等價於
hrdb=> SELECT 5 > 1 AND 5 < 6 AS result;
 result
--------
 t
(1 row)開發

hrdb=> --NOT BETWEEN AND ,表示不在某個範圍
hrdb=> SELECT 5 NOT BETWEEN 7 AND 10 AS result;
 result
--------
 t
(1 row)數學

hrdb=> --BETWEEN SYMMETRIC AND,表示排序後比較
hrdb=> --該謂詞的用法一般發生在BETWEEN AND之間出現倒序的狀況
hrdb=> --如使用 SELECT 5 BETWEEN 10 AND 10; 將會返回FALSE
hrdb=> --所以要想返回TRUE須要按照以下使用
hrdb=> SELECT 5 BETWEEN SYMMETRIC 10 AND 1 AS result;
 result
--------
 t
(1 row)it

hrdb=> --NOT BETWEEN SYMMETRIC AND與上述 BETWEEN SYMMETRIC AND 相反
hrdb=> --IS DISTINCT FROM 不等於,null 返回TRUE
hrdb=> SELECT 'a' IS DISTINCT FROM 'b' AS result;
 result
--------
 t
(1 row)

hrdb=> SELECT null IS DISTINCT FROM 'b' AS result;
 result
--------
 t
(1 row)

hrdb=> --IS NOT DISTINCT FROM 等於,null返回FALSE
hrdb=> SELECT 'a' IS NOT DISTINCT FROM 'b' AS result;
 result
--------
 f
(1 row)

hrdb=> SELECT null IS NOT DISTINCT FROM 'b' AS result;
 result
--------
 f
(1 row)

hrdb=> --IS NULL 判斷爲空
hrdb=> SELECT 'a' IS NULL AS result;
 result
--------
 f
(1 row)

hrdb=> SELECT '' IS NULL AS result;
 result
--------
 f
(1 row)

hrdb=> --IS NOT NULL 判斷不爲空
hrdb=> SELECT 'a' IS NOT NULL AS result;
 result
--------
 t
(1 row)

hrdb=> SELECT '' IS NOT NULL AS result;
 result
--------
 t
(1 row)

hrdb=> --ISNULL 判斷爲空 (非標準語法)
hrdb=> --NOTNULL 判斷不爲空(非標準語法)
hrdb=> SELECT 'a' ISNULL as result;
 result
--------
 f
(1 row)

hrdb=> SELECT '' NOTNULL AS result;
 result
--------
 t
(1 row)

hrdb=> --IS TRUE 判斷是否爲TRUE
hrdb=> SELECT 'A' > 'B' IS TRUE AS result;
 result
--------
 f
(1 row)

hrdb=> --IS NOT TRUE 判斷是否爲FALSE
hrdb=> SELECT 'A' > 'B' IS NOT TRUE AS result;
 result
--------
 t
(1 row)

hrdb=> --IS FALSE 判斷是否爲 FALSE
hrdb=> SELECT 'A' > 'B' IS FALSE AS result;
 result
--------
 t
(1 row)

hrdb=> --IS NOT FALSE 判斷是否不爲FALSE
hrdb=> SELECT 'A' > 'B' IS NOT FALSE AS result;
 result
--------
 f
(1 row)
--IS UNKNOWN 未知
hrdb=> SELECT NULL IS UNKNOWN AS result;
 result
--------
 t
--IS NOT UNKNOWN
SELECT 'a' > 'b' IS NOT UNKNOWN AS result;

舒適提示

字符之間的比較一般使用ascii值比較大小。同時,UNKNOWN 和 NOT UNKNOWN 一般和IS NULL 和IS NOT NULL相似。在PostgreSQL中,還有比較函數, num_nonnulls(VARIADIC "any"),表示返回一個非空輸入字符的總個數。num_nulls(VARIADIC "any"),表示返回一個null值的總個數。以下:

hrdb=> SELECT num_nonnulls(1, www.otahb.com  null,2) AS total_nonnulls;

 total_nonnulls
----------------
    2
(1 row)

hrdb=> SELECT num_nonnulls('PostgreSQL','MySQL','','null',null) AS total_nonnulls;
 total_nonnulls
----------------
    4
(1 row)

hrdb=> SELECT num_nulls(1,null,2) AS total_nulls;
 total_nulls
-------------
   1
(1 row)

hrdb=> SELECT num_nulls('PostgreSQL','MySQL','','null',null) AS total_nulls;
 total_nulls
-------------
   1

邏輯操做符

在PostgreSQL中,邏輯操做符有 AND、 OR 和 NOT,邏輯操做符返回的結果一般爲一個布爾值或者NULL,即 TRUE、FALSE或者NULL。其中NULL表示運算結果未知。同時對於邏輯操做符都有優先級順序,AND 、OR 和 NOT的優先級順序爲: NOT > AND >OR。

對於邏輯操做符的之間的運算結果參考下表:

50b12993c02a7d5bc3f7db8c7d8b9372.jpeg

示例:

hrdb=> --2 > 1 爲 TRUE, 'a' < 'b' 爲TRUE,那麼 AND 返回TRUE
hrdb=> SELECT 2 > 1 AND 'a' < 'b' AS result;
 result
--------
 t
(1 row)

hrdb=> --1 < 2 爲 TRUE, 2 > 1爲FALSE,那麼 AND 的結果爲 FALSE
hrdb=> SELECT 1 < 2 AND 2 > 1 AS result;
 result
--------
 t
(1 row)

hrdb=> -- NULL 和 2 > 1 爲TRUE作比較,那麼 AND 返回NULL
hrdb=> SELECT NULL AND 2 > 1 AS result;
 result
--------
 
(1 row)

hrdb=> --2 < 1 爲 FALSE,'b' < 'a' 爲FALSE,那麼 AND 返回 FALSE
hrdb=> SELECT 2 < 1 AND 'b' < 'a' AS result;
 result
--------
 f
(1 row)

hrdb=> -- NULL 和 1 > 2 爲FALSE作比較,那麼 AND 返回FALSE
hrdb=> SELECT NULL AND 1 > 2 AS result;
 result
--------
 f
(1 row)

hrdb=> --NULL 和 NULL AND 的結果爲 NULL
hrdb=> SELECT NULL AND NULL AS result;
 result
--------
 
(1 row)
hrdb=> --2 > 1 爲 TRUE, 'a' < 'b' 爲TRUE,那麼 OR 返回TRUE
hrdb=> SELECT 2 > 1 AND 'a' < 'b' AS result;
 result
--------
 t
(1 row)

hrdb=> --1 < 2 爲 TRUE, 2 > 1爲FALSE,那麼 OR 的結果爲 TRUE
hrdb=> SELECT 1 < 2 AND 2 > 1 AS result;
 result
--------
 t
(1 row)

hrdb=>
hrdb=> -- NULL 和 2 > 1 爲TRUE作比較,那麼 OR 返回 TRUE
hrdb=> SELECT NULL AND 2 > 1 AS result;
 result
--------
 
(1 row)

hrdb=> --2 < 1 爲 FALSE,'b' < 'a' 爲FALSE,那麼 OR 返回 FALSE
hrdb=> SELECT 2 < 1 AND 'b' < 'a' AS result;
 result
--------
 f
(1 row)

hrdb=> -- NULL 和 1 > 2 爲FALSE作比較,那麼 OR 返回 NULL
hrdb=> SELECT NULL AND 1 > 2 AS result;
 result
--------
 f
(1 row)

hrdb=> --NULL 和 NULL 那麼 OR 的結果爲 NULL
hrdb=> SELECT NULL AND NULL AS result;
 result
--------

關於 NOT 結果,在這裏不作示例,有興趣的能夠下去自行驗證。

算數操做符

PostgreSQL中的算數操做符號有 +(加法) 、-(減法) 、* (乘法)、/(除法) 、%(取餘)、^(冪運算符)、|/(平方根)、||/(立方根)、!(階乘[後綴])、!!(階乘[前綴])、@(絕對值)、&(按位與)、|(按位或)、#(按位異或)、~(按位取反)、<<(左移)、>>(右移)操做符,這些操做符簡化了數學運算方式。

示例:

加減乘除示例在此略。此示例重點介紹一下後面的操做符號。

hrdb=> --%取餘操做符,5 除以 3 ,返回餘數 2
hrdb=> SELECT 5 % 3 AS result;
 result
--------
  2
(1 row)

hrdb=> --^求冪操做,3 的 4次方爲81
hrdb=> SELECT 3^4 AS result;
 result
--------
  81
(1 row)

hrdb=> --|/平方根,25的平方根爲 5
hrdb=> SELECT |/ 25 AS result;
 result
--------
  5
(1 row)

hrdb=> --||/立方根,27 的立方根爲 3
hrdb=> SELECT ||/ 27 AS result;
  result 
--------------------
 3.0000000000000004
(1 row)

hrdb=> --!階乘後綴,5的階乘爲 120
hrdb=> SELECT 5 ! AS result;
 result
--------
 120
(1 row)

hrdb=> --!!階乘前綴,5的階乘爲 120
hrdb=> SELECT !! 5 AS result;
 result
--------
 120
(1 row)

hrdb=> --@絕對值,-1的絕對值爲 1
hrdb=> SELECT @ -1 AS result;
 result
--------
  1
(1 row)

hrdb=> --& 按位與,5 & 3的值爲 1
hrdb=> --計算過程
hrdb=> --5 用二進制表示 0000 0101
hrdb=> --3 用二進制表示 0000 0011
hrdb=> --按位與操做,同時爲1則爲1,不然爲0
hrdb=> --按位與操做,同時爲1則爲1,不然爲0
hrdb=> -- 5 & 3   0000 0001 再轉換爲10進製爲 1
hrdb=> SELECT 5 & 3 AS result;
 result
--------
  1
(1 row)

hrdb=> --| 按位或,6 | 3 的值爲 7
hrdb=> --計算過程
hrdb=> --6 用二進制表示 0000 0110
hrdb=> --3 用二進制表示 0000 0011
hrdb=> --按位或操做,只要有一個爲1則爲1
hrdb=> --6 | 3   0000 0111 轉換爲10進製爲7
hrdb=> SELECT 6 | 3 AS result;
 result
--------
  7
(1 row)

hrdb=> --# 按位異或,8 # 5 的值爲13
hrdb=> --計算過程
hrdb=> --8 用二進制表示 0000 1000
hrdb=> --5 用二進制表示 0000 0101
hrdb=> --按位異或操做,不一樣爲1,相同爲0
hrdb=> --8 # 5   0000 1101 轉換爲10進製爲 13
hrdb=> SELECT 8 # 5 AS result;
 result
--------
  13
(1 row)

hrdb=> --~按位取反,7 按位取反的值爲 16
hrdb=> --計算過程
hrdb=> --7 用二進制表示 0000 0111
hrdb=> --按位取反,最高位爲0 取 1表示符號,其他按位取反
hrdb=> --~7    1000 1000 轉換爲10進製爲-8
hrdb=> SELECT ~7 AS result;
 result
--------
  -8
(1 row)

hrdb=> --<<左移,4 左移 2位的值爲:
hrdb=> --計算過程
hrdb=> --4用二進制表示 0000 0100
hrdb=> --4左移兩位 000001 0000 位數不足用 0 補位
hrdb=> --轉換爲10進制後爲 16。所以左移相似於平方操做,可是效率比平方高
hrdb=> SELECT 4 << 2 AS result;
 result
--------
  16
(1 row)

hrdb=> -->>右移,8 右移 3 位的值爲1
hrdb=> --8 用二進制表示 0000 1000
hrdb=> --8 >> 3 ,   0 0001000 多出的0去掉轉換爲10進制,爲1
hrdb=> SELECT 8 >> 3 AS result;
 result
--------
  1
(1 row)

總結

在PostgreSQL 中,除了以上三種操做符爲關係型數據庫中經常使用的操做符外,還有其它的操做符爲PostgreSQL中獨有的操做符,好比文本查找操做符,@@(tsvector類型與tsquery類型字符是否匹配),@>(tsquery類型之間是否包含),<@(tsquery類型之間是否被包含)操做符。網絡地址操做符如<<=(表示包含於或者等於),>>=(包含或者等於)。幾何操做符如@-@(表示圖形的周長或者長度),@@(表示圓心),<->(表示圓心距),&&(表示圖形是否重疊)等,感興趣的同窗下去自行驗證。

相關文章
相關標籤/搜索