successively
until the first one that is true is found. Then the
associated statement(s) are executed, after which control
passes to the next statement after <literal>END IF</literal>.
(Any subsequent <literal>IF</literal> conditions are <emphasis>not</emphasis>
tested.) If none of the <literal>IF</literal> conditions is true,
then the <literal>ELSE</literal> block (if any) is executed.
</para>
<para>
Here is an example:
<programlisting>
IF number = 0 THEN
result := 'zero';
ELSIF number > 0 THEN
result := 'positive';
ELSIF number < 0 THEN
result := 'negative';
ELSE
-- hmm, the only other possibility is that number is null
result := 'NULL';
END IF;
</programlisting>
</para>
<para>
The key word <literal>ELSIF</literal> can also be spelled
<literal>ELSEIF</literal>.
</para>
<para>
An alternative way of accomplishing the same task is to nest
<literal>IF-THEN-ELSE</literal> statements, as in the
following example:
<programlisting>
IF demo_row.sex = 'm' THEN
pretty_sex := 'man';
ELSE
IF demo_row.sex = 'f' THEN
pretty_sex := 'woman';
END IF;
END IF;
</programlisting>
</para>
<para>
However, this method requires writing a matching <literal>END IF</literal>
for each <literal>IF</literal>, so it is much more cumbersome than
using <literal>ELSIF</literal> when there are many alternatives.
</para>
</sect3>
<sect3 id="plpgsql-conditionals-simple-case">
<title>Simple <literal>CASE</literal></title>
<synopsis>
CASE <replaceable>search-expression</replaceable>
WHEN <replaceable>expression</replaceable> <optional>, <replaceable>expression</replaceable> <optional> ... </optional></optional> THEN
<replaceable>statements</replaceable>
<optional> WHEN <replaceable>expression</replaceable> <optional>, <replaceable>expression</replaceable> <optional> ... </optional></optional> THEN
<replaceable>statements</replaceable>
... </optional>
<optional> ELSE
<replaceable>statements</replaceable> </optional>
END CASE;
</synopsis>
<para>
The simple form of <command>CASE</command> provides conditional execution
based on equality of operands. The <replaceable>search-expression</replaceable>
is evaluated (once) and successively compared to each
<replaceable>expression</replaceable> in the <literal>WHEN</literal> clauses.
If a match is found, then the corresponding
<replaceable>statements</replaceable> are executed, and then control
passes to the next statement after <literal>END CASE</literal>. (Subsequent
<literal>WHEN</literal> expressions are not evaluated.) If no match is
found, the <literal>ELSE</literal> <replaceable>statements</replaceable> are
executed; but if <literal>ELSE</literal> is not present, then a
<literal>CASE_NOT_FOUND</literal> exception is raised.
</para>
<para>
Here is a simple example:
<programlisting>
CASE x
WHEN 1, 2 THEN
msg := 'one or two';
ELSE
msg := 'other value than one or two';
END CASE;
</programlisting>
</para>
</sect3>
<sect3 id="plpgsql-conditionals-searched-case">
<title>Searched <literal>CASE</literal></title>
<synopsis>
CASE
WHEN <replaceable>boolean-expression</replaceable> THEN
<replaceable>statements</replaceable>
<optional> WHEN <replaceable>boolean-expression</replaceable> THEN
<replaceable>statements</replaceable>
... </optional>
<optional> ELSE
<replaceable>statements</replaceable> </optional>
END CASE;
</synopsis>
<para>
The searched form of <command>CASE</command> provides conditional execution
based on truth of Boolean expressions. Each <literal>WHEN</literal> clause's
<replaceable>boolean-expression</replaceable> is evaluated