# 15.1. 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`