

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 逻辑运算符
<a name="sql-reference-logical-operators"></a>

逻辑运算符允许您创建条件并测试其结果。


| 运算符 | 一元/二进制 | 说明 | 运算对象 | 
| --- | --- | --- | --- | 
|  NOT  |  U  |  逻辑求反  |  布尔值  | 
|  AND  |  B  |  连词  |  布尔值  | 
|  或  |  B  |  析取  |  布尔值  | 
|  IS  |  B  |  逻辑断言  |  布尔值  | 
|  IS NOT UNKNOWN  |  U  |  否定未知比较： <expr> IS NOT UNKNOWN  |  布尔值  | 
|  IS NULL  |  U  |  Null 比较： <expr> IS NULL  |  任何  | 
|  IS NOT NULL  |  U  |  否定 null 比较： <expr> IS NOT NULL  |  任何  | 
|  =  |  B  |  等于  |  任何  | 
|  \$1=  |  B  |  不等于  |  任何  | 
|  <>  |  B  |  不等于  |  任何  | 
|  >  |  B  |  Greater than  |  有序类型（数字、字符串、日期、时间）  | 
|  >=  |  B  |  大于或等于（不小于）  |  有序类型  | 
|  <  |  B  |  Less than  |  有序类型  | 
|  <=  |  B  |  小于或等于（不大于）  |  有序类型  | 
|  BETWEEN  |  三元  |  范围比较： col1 BETWEEN expr1 AND expr2  |  有序类型  | 
|  IS DISTINCT FROM  |  B  |  区别  |  任何  | 
|  IS NOT DISTINCT FROM  |  B  |  否定区别  |  任何  | 

## 三态布尔逻辑
<a name="three_state_boolean_logic"></a>

SQL 布尔值有三种可能的状态，而不是通常的两种状态：TRUE、FALSE 和 UNKNOWN，其中最后一种等同于布尔值 NULL。TRUE 和 FALSE 运算对象通常根据普通的双态布尔逻辑起作用，但是在将它们与 UNKNOWN 运算对象配对时会适用其他规则，如下表所示。

**注意**  
UNKOWN 表示“可能是 TRUE，也可能是 FALSE”，或者换句话说，“不绝对是 TRUE，也不绝对是 FALSE”。这种理解可以帮助您弄清为什么表中的某些表达式会这样计算。


**求反 (NOT)**  

| 操作 | 结果 | 
| --- | --- | 
|  NOT TRUE  |  FALSE  | 
|  NOT FALSE  |  TRUE  | 
|  NOT UNKNOWN  |  UNKNOWN  | 


**连词 (AND)**  

| 操作 | 结果 | 
| --- | --- | 
|  TRUE AND TRUE  |  TRUE  | 
|  TRUE AND FALSE  |  FALSE  | 
|  TRUE AND UNKNOWN  |  UNKNOWN  | 
|  FALSE AND TRUE  |  FALSE  | 
|  FALSE AND FALSE  |  FALSE  | 
|  FALSE AND UNKNOWN  |  FALSE  | 
|  UNKNOWN AND TRUE  |  UNKNOWN  | 
|  UNKNOWN AND FALSE  |  FALSE  | 
|  UNKNOWN AND UNKNOWN  |  UNKNOWN  | 


**析取 (OR)**  

| 操作 | 结果 | 
| --- | --- | 
|  TRUE OR TRUE  |  TRUE  | 
|  TRUE OR FALSE  |  TRUE  | 
|  TRUE OR UNKNOWN  |  TRUE  | 
|  FALSE OR TRUE  |  TRUE  | 
|  FALSE OR FALSE  |  FALSE  | 
|  FALSE OR UNKNOWN  |  UNKNOWN  | 
|  UNKNOWN OR TRUE  |  TRUE  | 
|  UNKNOWN OR FALSE  |  UNKNOWN  | 
|  UNKNOWN OR UNKNOWN  |  UNKNOWN  | 


**断言 (IS)**  

| 操作 | 结果 | 
| --- | --- | 
|  TRUE IS TRUE  |  TRUE  | 
|  TRUE IS FALSE  |  FALSE  | 
|  TRUE IS UNKNOWN  |  FALSE  | 
|  FALSE IS TRUE  |  FALSE  | 
|  FALSE IS FALSE  |  TRUE  | 
|  FALSE IS UNKNOWN  |  FALSE  | 
|  UNKNOWN IS TRUE  |  FALSE  | 
|  UNKNOWN IS FALSE  |  FALSE  | 
|  UNKNOWN IS UNKNOWN  |  TRUE  | 


**IS NOT UNKNOWN**  

| 操作 | 结果 | 
| --- | --- | 
|  TRUE IS NOT UNKNOWN  |  TRUE  | 
|  FALSE IS NOT UNKNOWN  |  TRUE  | 
|  UNKNOWN IS NOT UNKNOWN  |  FALSE  | 

IS NOT UNKNOWN 本身就是一个特殊的运算符。表达式“x IS NOT UNKNOWN”等同于“(x IS TRUE) OR (x IS FALSE)”，而不是“x IS (NOT UNKNOWN)”。因此，在上表中替换：


| x | 操作 | 结果 |   | 在“(x IS TRUE) OR (x IS FALSE)”中替换 x 的结果 | 
| --- | --- | --- | --- | --- | 
|  TRUE  |  TRUE IS NOT UNKNOWN  |  TRUE  |  变为  |  “(TRUE IS TRUE) OR (TRUE IS FALSE)”，即 TRUE  | 
|  FALSE  |  FALSE IS NOT UNKNOWN  |  TRUE  |  变为  |  “(FALSE IS TRUE) OR (FALSE IS FALSE)”，即 TRUE  | 
|  UNKNOWN  |  UNKNOWN IS NOT UNKNOWN  |  FALSE  |  变为  |  “(UNKNOWN IS TRUE) OR (UNKNOWN IS FALSE)”，即 FALSE， 因为 UNKNOWN 既不是 TRUE 也不是 FALSE  | 

由于 IS NOT UNKNOWN 是一个特殊的运算符，因此上述运算在 IS 这个词周围是不可传递的：


| 操作 | 结果 | 
| --- | --- | 
|  NOT UNKNOWN IS TRUE  |  FALSE  | 
|  NOT UNKNOWN IS FALSE  |  FALSE  | 
|  NOT UNKNOWN IS UNKNOWN  |  TRUE  | 


**IS NULL 和 IS NOT NULL**  

| 操作 | 结果 | 
| --- | --- | 
|  UNKNOWN IS NULL  |  TRUE  | 
|  UNKNOWN IS NOT NULL  |  FALSE  | 
|  NULL IS NULL  |  TRUE  | 
|  NULL IS NOT NULL  |  FALSE  | 


**IS DISTINCT FROM 和 IS NOT DISTINCT FROM**  

| 操作 | 结果 | 
| --- | --- | 
|  UNKNOWN IS DISTINCT FROM TRUE  |  TRUE  | 
|  UNKNOWN IS DISTINCT FROM FALSE  |  TRUE  | 
|  UNKNOWN IS DISTINCT FROM UNKNOWN  |  FALSE  | 
|  UNKNOWN IS NOT DISTINCT FROM TRUE  |  FALSE  | 
|  UNKNOWN IS NOT DISTINCT FROM FALSE  |  FALSE  | 
|  UNKNOWN IS NOT DISTINCT FROM UNKNOWN  |  TRUE  | 



通常，“x IS DISTINCT FROM y”类似于“x <> y”，在 x 或 y（而非二者）为 NULL 时也为 true 的情况除外。DISTINCT FROM 与“相同”相反，后者的通常含义是值（true、false 或 unknown）与其自身相同，并且与其他所有值不同。IS 和 IS NOT 运算符以一种特殊的方式处理 UNKOWN，因为它表示“可能是 TRUE，也许是 FALSE”。

## 其他逻辑运算符
<a name="w2aac10c19c25b9"></a>

对于所有其他运算符，传递 NULL 或 UNKNOWN 运算对象将导致结果为 UNKNOWN（与 NULL 相同）。


**示例**  

| 操作 | 结果 | 
| --- | --- | 
|  TRUE AND CAST( NULL AS BOOLEAN)  |  UNKNOWN  | 
|  FALSE AND CAST( NULL AS BOOLEAN)  |  FALSE  | 
|  1 > 2  |  FALSE  | 
|  1 < 2  |  TRUE  | 
|  'foo' = 'bar'  |  FALSE  | 
|  'foo' <> 'bar'  |  TRUE  | 
|  'foo' <= 'bar'  |  FALSE  | 
|  'foo' <= 'bar'  |  TRUE  | 
|  3 BETWEEN 1 AND 5  |  TRUE  | 
|  1 BETWEEN 3 AND 5  |  FALSE  | 
|  3 BETWEEN 3 AND 5  |  TRUE  | 
|  5 BETWEEN 3 AND 5  |  TRUE  | 
|  1 IS DISTINCT FROM 1.0  |  FALSE  | 
|  CAST( NULL AS INTEGER ) IS NOT DISTINCT FROM CAST (NULL AS INTEGER)  |  TRUE  | 