
# 比较函数和比较操作符
比较操作符用于对两个数据的大小进行比较，并返回一个布尔类型的值。
比较操作符均为二元运算符，具体请参见[表1](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/gaussdb-81-0144.html#ZH-CN_TOPIC_0000002558805327__zh-cn_topic_0000002558053597_zh-cn_topic_0000001790097185_table1030093821715)。M-Compatibility模式下提供的比较操作符请参见[表1](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/gaussdb-81-0144.html#ZH-CN_TOPIC_0000002558805327__zh-cn_topic_0000002558053597_zh-cn_topic_0000001790097185_table1030093821715)。
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 不等于的计算优先级高于等于。
- M-Compatibility模式下目前只支持btree索引和ubtree索引。
- \<\>和\<=\>不支持索引扫描。
- \<=\>不支持hash连接和合并连接。

- \<=\>不支持行比较。
- \<、\<=、=、\>=、\>、\<\>操作符支持行表达式与NULL值比较。
- IS NULL、ISNULL操作支持行表达式作为参数使用。
```
m_db=# SELECT (1,2) <=> row(2,3);
ERROR:  could not determine interpretation of row comparison operator <=>
LINE 1: select (1,2) <=> row(2,3);
                     ^
HINT:  unsupported operator.
m_db=# SELECT (1,2) < NULL;
 ?column? 
----------
(1 row)
m_db=# SELECT (1,2) <> NULL;
 ?column? 
----------
(1 row)
m_db=# SELECT (1, 2)  IS NULL;
 ?column? 
----------
 f
(1 row)
m_db=# SELECT ISNULL((1, 2));
 ?column? 
----------
 f
(1 row)
```
#### 比较操作符
- \<操作符 描述：小于操作。
  示例：
  ```
  m_db=# SELECT 2 < 2;
   ?column? 
  ----------
   f
  (1 row)
  ```
  
 
- \>操作符 描述：大于操作符。
  示例：
  ```
  m_db=# SELECT 2 > 2;
   ?column? 
  ----------
   f
  (1 row)
  ```
  
- \<=操作符 描述：小于等于操作符。
  示例：
  ```
  m_db=# SELECT 0.1 <= 0.2;
   ?column? 
  ----------
   t
  (1 row)
  ```
  
- \>=操作符 描述：大于等于操作符。
  示例：
  ```
  m_db=# SELECT 2 >= 2;
   ?column? 
  ----------
   t
  (1 row)
  ```
  
- =操作符 描述：等于操作符。
  示例：
  ```
  m_db=# SELECT 2 = 2;
   ?column? 
  ----------
   t
  (1 row)
  ```
  
- \<\>或!=操作符 描述：不等于操作符。
  示例：
  ```
  m_db=# SELECT 1 <> 2;
   ?column? 
  ----------
   t
  (1 row)
  ```
  
- \<=\>操作符 描述：NULL安全等于操作符，此操作符执行与=操作符类似的相等比较，但NULL与NULL进行NULL安全等于比较时返回t，否则返回f。
  示例：
  ```
  m_db=# SELECT 1 <=> 1, 1 <=> NULL, NULL <=> NULL;
   ?column? | ?column? | ?column? 
  ----------+----------+----------
   t        | f        | t
  (1 row)
  ```
  

- IS操作符
  ```
  expr IS boolean_value
  ```
  描述：判断expr是否等价于boolean_value，如果等价则返回真（t），否则返回假（f）。其中boolean_value可以是TRUE、FALSE、NULL或UNKNOWN。
  示例：
  ```
  m_db=# SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
   is true | is false | ?column? 
  ---------+----------+----------
   t       | t        | t
  (1 row)
  ```
  

- IS NOT操作符
  ```
  expr IS NOT boolean_value
  ```
  描述：判断expr是否不等价于boolean_value，如果不等价则返回真（t），否则返回假（f）。其中boolean_value可以是TRUE、FALSE、NULL或UNKNOWN。
  示例：
  ```
  m_db=# SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
   ?column? | ?column? | ?column? 
  ----------+----------+----------
   t        | t        | f
  (1 row)
  ```
  

- IS NOT NULL操作符
  ```
  expr IS NOT NULL
  ```
  描述：判断expr是否为非NULL。如果是则返回真（t），否则返回假（f）。
  示例：
  ```
  m_db=# SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
   ?column? | ?column? | ?column? 
  ----------+----------+----------
   t        | t        | f
  (1 row)
  ```
  

- IS NULL操作符
  ```
  expr IS NULL
  ```
  描述：判断expr是否为NULL。如果是则返回真（t），否则返回假（f）。
  示例：
  ```
  m_db=# SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
   ?column? | ?column? | ?column? 
  ----------+----------+----------
   f        | f        | t
  (1 row)
  ```
  
#### 比较函数
- COALESCE(value1, value2, ...) 描述：返回参数列表中第一个非NULL值。如果没有非NULL值，该函数返回空值。
  返回值类型：由类型推导矩阵决定，会根据入参的类型决定返回值类型。
  示例：
  ```
  m_db=# SELECT COALESCE(NULL, 1);
   coalesce 
  ----------
          1
  (1 row)
  m_db=# SELECT COALESCE(NULL, NULL, NULL);
   coalesce 
  ----------
  (1 row)
  ```
  
 
- GREATEST(value1, value2, ...) 描述：返回参数列表中的最大值。
  参数：至少需要两个参数。
  示例：
  ```
  m_db=# SELECT GREATEST(34.0, 3.0, 5.0, 767.0);
   greatest 
  ----------
      767.0
  (1 row)
  m_db=# SELECT GREATEST('B', 'A', 'C');
   greatest 
  ----------
   C
  (1 row)
  ```
  
- INTERVAL(N, N1, N2, N3, ...) 描述：返回N与其他参数组成的列表(N1, N2, N3, ...)的比较情况。
  参数：至少需要两个参数，所有传入的参数被视为数字类型。
  返回值类型：SMALLINT
  - 如果N为NULL，则返回-1。
  
  - 如果N\<N1，则返回0。
  
  - 如果存在正整数j，对于任意正整数i≤j，都有N~­­i~≤N≤N~j+1~，则返回j。
  
  
  示例：
  ```
  m_db=# SELECT INTERVAL(24, 2, 5, 14, 26, 28, 46);
   interval 
  ----------
          3
  (1 row)
  m_db=# SELECT INTERVAL(24, 29, 5, 14);
   interval 
  ----------
          0
  (1 row)
  ```
  
- ISNULL(expr) 描述：如果参数expr为NULL，那么该函数返回t，否则返回f。
  参数：任意入参。
  返回值类型：BOOLEAN
  示例：
  ```
  m_db=# SELECT ISNULL('2023-01-01');
   isnull 
  --------
   f
  (1 row)
  m_db=# SELECT ISNULL(NULL);
   isnull 
  --------
   t
  (1 row)
  ```
  
- LEAST(value1, value2, ...) 描述：返回参数列表中的最小值。
  参数：至少需要两个参数。
  示例：
  ```
  m_db=# SELECT LEAST(34.0, 3.0, 5.0, 767.0);
   least 
  -------
     3.0
  (1 row)
  m_db=# SELECT LEAST('B', 'A', 'C');
   least 
  -------
   A
  (1 row)
  ```
  
 
