.. _logical_operators:

=================
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``
=========  =========
