
Logical Operators
=================

Logical Operators
-----------------

| Operator | Description                  | Example |
| :------- | :--------------------------- | :------ |
| `AND`    | True if both values are true | a AND b |
| `OR`     | True if either value is true | a OR b  |
| `NOT`    | True if the value is false   | NOT a   |

Effect of NULL on Logical Operators
-----------------------------------

The result of an `AND` comparison may be `NULL` if one or both sides of the expression are `NULL`. If at least one side of an `AND` operator is `FALSE` the expression evaluates to `FALSE`:

    SELECT CAST(null AS boolean) AND true; -- null
    
    SELECT CAST(null AS boolean) AND false; -- false
    
    SELECT CAST(null AS boolean) AND CAST(null AS boolean); -- null

The result of an `OR` comparison may be `NULL` if one or both sides of the expression are `NULL`. If at least one side of an `OR` operator is `TRUE` the expression evaluates to `TRUE`:

    SELECT CAST(null AS boolean) OR CAST(null AS boolean); -- null
    
    SELECT CAST(null AS boolean) OR false; -- null
    
    SELECT CAST(null AS boolean) OR true; -- true

The following truth table demonstrates the handling of `NULL` in `AND` and `OR`:

 

| a       | b       | a AND b | a OR b  |
| :------ | :------ | :------ | :------ |
| `TRUE`  | `TRUE`  | `TRUE`  | `TRUE`  |
| `TRUE`  | `FALSE` | `FALSE` | `TRUE`  |
| `TRUE`  | `NULL`  | `NULL`  | `TRUE`  |
| `FALSE` | `TRUE`  | `FALSE` | `TRUE`  |
| `FALSE` | `FALSE` | `FALSE` | `FALSE` |
| `FALSE` | `NULL`  | `FALSE` | `NULL`  |
| `NULL`  | `TRUE`  | `NULL`  | `TRUE`  |
| `NULL`  | `FALSE` | `FALSE` | `NULL`  |
| `NULL`  | `NULL`  | `NULL`  | `NULL`  |

 

The logical complement of `NULL` is `NULL` as shown in the following example:

    SELECT NOT CAST(null AS boolean); -- null

The following truth table demonstrates the handling of `NULL` in `NOT`:

| a       | NOT a   |
| :------ | :------ |
| `TRUE`  | `FALSE` |
| `FALSE` | `TRUE`  |
| `NULL`  | `NULL`  |