
# 逻辑操作符
M-Compatibility模式下支持AND（\&\&）、OR（\|\|）、NOT（!）、XOR四个逻辑操作符，详见[表1](https://support.huaweicloud.com/centralized-m-comp-devg-v8-gaussdb/gaussdb-81-0144.html#ZH-CN_TOPIC_0000002559099345__zh-cn_topic_0000002526893576_zh-cn_topic_0000001790097185_table1030093821715)。运算结果有三种结果，分别为TRUE、FALSE和空值。
表1逻辑操作符详情 
| 运算符      | 操作数 | 含义   |
|:---|:---|:---|
| NOT/!    | 一元  | 逻辑非  |
| AND/\&\& | 二元  | 逻辑与  |
| OR/\|\|  | 二元  | 逻辑或  |
| XOR      | 二元  | 逻辑异或 |
   
运算规则请参见[NOT操作符]和[AND、OR、XOR操作符]，表中的a和b代表逻辑表达式。
 #### NOT操作符
如果操作数为真，则计算结果为假。如果操作数为假，则计算结果为真。
取值范围：布尔类型
运算规则：
表2NOT运算规则表（以TRUE、FALSE、NULL进行运算） 
| a     | NOT a |
|:---|:---|
| TRUE  | FALSE |
| FALSE | TRUE  |
| NULL  | 空值    |
   
![](https://support.huaweicloud.com/centralized-m-comp-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
"!"和"NOT"功能相同，但是"!"的优先级高于"NOT"。
示例：
```
m_db=# SELECT NOT TRUE;
 ?column? 
----------
 f
(1 row)
m_db=# SELECT NOT FALSE;
 ?column? 
----------
 t
(1 row)
m_db=# SELECT NOT NULL;
 ?column? 
----------
 
(1 row)
```
 #### AND、OR、XOR操作符
AND、OR、XOR的运算逻辑如下：
表3AND、OR、XOR运算规则表（以TRUE、FALSE、NULL进行运算） 
| **a** | b     | a AND b的结果 | aOR b的结果 | a XOR b的结果 |
|:---|:---|:---|:---|:---|
| TRUE  | TRUE  | TRUE       | TRUE     | FALSE      |
| TRUE  | FALSE | FALSE      | TRUE     | TRUE       |
| TRUE  | NULL  | 空值         | TRUE     | 空值         |
| FALSE | FALSE | FALSE      | FALSE    | FALSE      |
| FALSE | NULL  | FALSE      | 空值       | 空值         |
| NULL  | NULL  | 空值         | 空值       | 空值         |
   
![](https://support.huaweicloud.com/centralized-m-comp-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
操作符AND、XOR和OR具有交换性，即交换左右两个操作数，不影响其结果。
示例：
```
m_db=# SELECT TRUE AND TRUE;
 ?column? 
----------
 t
(1 row)
m_db=# SELECT TRUE OR FALSE;
 ?column? 
----------
 t
(1 row)
m_db=# SELECT TRUE XOR NULL;
 ?column? 
----------
 
(1 row)
```
#### 逻辑操作符规格约束
逻辑运算支持当前M-Compatibility数据库所有已支持的数据类型。不同大类型之间的数据操作时，先提升到大类型，再根据提升后的大类型的结果是否为0进行计算。提升规则如下表所示。
表4逻辑运算类型归类 
| 操作符        | **左右入参类型**                                                                                                                                                      | 归类类型   |
|:---|:---|:---|
| XOR        | 所有类型                                                                                                                                                            | BIGINT |
| AND、OR、NOT | TINYINT、SMALLINT、MEDIUMINT、INT/INTEGER、BIGINT、TINYINT UNSIGNED、SMALLINT UNSIGNED、MEDIUMINT UNSIGNED、INT/INTEGER UNSIGNED、BIGINT UNSIGNED、BIT、YEAR、BOOL/LBOOLEAN | BIGINT |
| AND、OR、NOT | 其它                                                                                                                                                              | DOUBLE |
   
