閱讀596 返回首頁    go 英雄聯盟


比較運算符__運算符_SQL語法參考_雲數據庫 OceanBase-阿裏雲

OceanBase比較的策略是,先將操作數轉換為相同的類型,然後進行比較。所有比較運算符的返回類型為Bool或者NULL。比較結果為真則返回“1”,為假則返回“0”,不確定則返回“NULL”。

數值比較

比較運算符用於比較兩個數值的大小。OceanBase支持的比較運算符如下表所示。

表達式 含義 舉例
= 等於。 SELECT 1=0, 1=1, 1=NULL;
>= 大於等於。 SELECT 1>=0, 1>=1, 1>=2, 1>=NULL;
> 大於。 SELECT 1>0, 1>1, 1>2, 1>NULL;
<= 小於等於。 SELECT 1<=0, 1<=1, 1<=2, 1<=NULL;
< 小於。 SELECT 1<0, 1<1, 1<2, 1<NULL;
!=或<> 不等於。 SELECT 1!=0, 1!=1, 1<>0, 1<>1, 1!=NULL, 1<>NULL;

數值比較運算符的類型轉換規則如下表所示。

INT FLOAT DOUBLE TIMESTAMP VARCHAR BOOL NULL
INT INT FLOAT DOUBLE Error ?INT Error NULL
FLOAT FLOAT DOUBLE Error ?FLOAT Error NULL
DOUBLE DOUBLE Error ?DOUBLE Error NULL
TIMESTAMP TIMESTAMP ?TIMESTAMP Error NULL
VARCHAR VARCHAR ?BOOL NULL
BOOL BOOL NULL
NULL NULL

注意:

  • “?”開頭的類型表示會在執行的時候嚐試轉換到指定類型,如果轉換失敗則報錯。
  • BOOL類型比較時,False小於True。

[NOT] BETWEEN … AND …

判斷是否存在或者不存在於指定範圍。

Oceanbase>SELECT 2 BETWEEN 1 AND 2, 3 NOT BETWEEN 1 AND 2, 1 BETWEEN null AND 0, 1 NOT BETWEEN null AND 0G
*************************** 1. row ***************************
       2 BETWEEN 1 AND 2: 1
   3 NOT BETWEEN 1 AND 2: 1
    1 BETWEEN null AND 0: 0
1 NOT BETWEEN null AND 0: 1
1 row in set (0.01 sec)

示例

有兩張表,emp雇員信息表(員工姓名、工資等信息)和salgrade工資等級表(工資範圍和工資等級);現要查詢員工姓名、工資以及工資等級信息。

Oceanbase>select * from emp;  //雇員信息表
+--------+----------+
| ename  | sal      |
+--------+----------+
| Jerry  | 25000.00 |
| Larry  | 40000.00 |
| Maggie | 46000.00 |
| Micky  | 15000.00 |
+--------+----------+
4 rows in set (0.00 sec)
Oceanbase>select * from salgrade; //工資等級表
+-------+----------+----------+
| grade | losal    | hisal    |
+-------+----------+----------+
|     1 | 10000.00 | 20000.00 |
|     2 | 20001.00 | 30000.00 |
|     3 | 30001.00 | 40000.00 |
|     4 | 40001.00 | 50000.00 |
|     5 | 50001.00 | 90000.00 |
+-------+----------+----------+
5 rows in set (0.00 sec)
Oceanbase>select a1.ename, a1.sal, a2.grade from emp a1, salgrade a2 where a1.sal between a2.losal and a2.hisal;  //通過between...and...設定查詢條件
+--------+----------+-------+
| ename  | sal      | grade |
+--------+----------+-------+
| Micky  | 15000.00 |     1 |
| Jerry  | 25000.00 |     2 |
| Larry  | 40000.00 |     3 |
| Maggie | 46000.00 |     4 |
+--------+----------+-------+
4 rows in set (0.00 sec)

[NOT] IN

判斷是否存在於指定集合。

Oceanbase>SELECT 2 IN (1, 2), 3 IN (1, 2)G;
*************************** 1. row ***************************
2 IN (1, 2): 1
3 IN (1, 2): 0
1 row in set (0.00 sec)

IS [NOT] NULL | TRUE | FALSE | UNKNOWN

判斷是否為NULL、真、假或未知。如果執行成功,結果是TRUE或者FALSE,不會出現NULL。

左參數必須是BOOL類型,或者是NULL,否則報錯。

Oceanbase>SELECT 0 IS NULL,
->     NULL IS NULL, NULL IS TRUE,
->     (0>1) IS FALSE,
->     NULL IS UNKNOWN,
->     0 IS NOT NULL,
->     NULL IS NOT NULL,
->     NULL IS NOT TRUE,
->     (0>1) IS NOT FALSE,
->     NULL IS NOT UNKNOWNG;
*************************** 1. row ***************************
          0 IS NULL: 0
       NULL IS NULL: 1
       NULL IS TRUE: 0
     (0>1) IS FALSE: 1
    NULL IS UNKNOWN: 1
      0 IS NOT NULL: 1
   NULL IS NOT NULL: 0
   NULL IS NOT TRUE: 1
 (0>1) IS NOT FALSE: 0
NULL IS NOT UNKNOWN: 0
1 row in set (0.00 sec)

向量比較運算符

向量比較運算符對兩個向量(ROW)進行比較,支持“<”、“ >”、“=”、“<=”、“>=”、 “!=”、“<=>”、“in”和“not in”等操作符。這幾個操作符都是二元操作符,被比較的兩個向量的維度要求相同。

“<=>”表示NULL-safe equal,這個操作符和=操作符執行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當一個操作碼為NULL時,其所得值為0而不為NULL。

表達式(1,2)和ROW(1,2)有時被稱為行構造符。兩者是等同的,在其它的語境中,也是合法的。例如,以下兩個語句在語義上是等同的(但是目前隻有第二個語句可以被優化):

SELECT * FROM t1 WHERE (column1, column2) = (1, 1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;

向量比較操作符和普通操作符相比主要有以下不同:

  • 如果兩個操作數的第i個標量的比較就決定了比較結果,則不再繼續比較後續的數值。

向量比較操作符需要注意以下幾點:

  • 多元向量比較,關鍵字ROW可以省略。例如,ROW(1,2,3) < ROW(1,3,5)等價於(1,2,3) < (1,3,4)。

  • in/not in操作一定是向量操作,表示左參數(不)在右集合內,集合用“()”括起。例如, 1 in (2, 3, 1)。

  • in/not in操作需要左右操作數對應位置的標量都是可以比較的,否則返回錯誤。例如,ROW(1,2) in (ROW(1,2), ROW(2,3), ROW(3,4))成功,ROW(1,2) in (ROW(2,1), ROW(2,3), ROW(1,3,4))失敗。

Oceanbase>SELECT ROW(1,2) < ROW(1, 3),
    -> ROW(1,2,10) < ROW(1, 3, 0),
    -> ROW(1,null) < ROW(1,0),
    -> ROW(null, 1) < ROW(null, 2),
    -> ROW(1,2) in (ROW(1,2), ROW(2,3), ROW(3,4), ROW(4,5)),
    -> 1 in (1,2,3),
    -> 1 not in (2,3,4),
    -> ROW(1,2) not in (ROW(2,1),ROW(2,3), ROW(3,4)),
    -> NULL = NULL,
    -> NULL <=> NULL,
    -> NULL <=> 1,
    -> 1 <=> 0 G;
*************************** 1. row ***************************
                                ROW(1,2) < ROW(1, 3): 1
                          ROW(1,2,10) < ROW(1, 3, 0): 1
                              ROW(1,null) < ROW(1,0): NULL
                         ROW(null, 1) < ROW(null, 2): NULL
ROW(1,2) in (ROW(1,2), ROW(2,3), ROW(3,4), ROW(4,5)): 1
                                        1 in (1,2,3): 1
                                    1 not in (2,3,4): 1
       ROW(1,2) not in (ROW(2,1),ROW(2,3), ROW(3,4)): 1
                                         NULL = NULL: NULL
                                       NULL <=> NULL: 1
                                          NULL <=> 1: 0
                                             1 <=> 0: 0
1 row in set (0.00 sec)

最後更新:2016-11-23 16:03:54

  上一篇:go 算術運算符__運算符_SQL語法參考_雲數據庫 OceanBase-阿裏雲
  下一篇:go 位運算符__運算符_SQL語法參考_雲數據庫 OceanBase-阿裏雲