-
CASE value
WHEN
[compare_value
] THEN
result
[WHEN
[compare_value
] THEN
result
...] [ELSE
result
] END
CASE WHEN [condition
] THEN
result
[WHEN
[condition
] THEN
result
...] [ELSE
result
] END
The first version returns the
result
where
value
=compare_value
.
The second version returns the result for the first condition
that is true. If there was no matching result value, the
result after ELSE
is returned, or
NULL
if there is no ELSE
part.
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
-> 'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
-> 'true'
mysql> SELECT CASE BINARY 'B'
-> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
-> NULL
The default return type of a CASE
expression is the compatible aggregated type of all return
values, but also depends on the context in which it is used.
If used in a string context, the result is returned as a
string. If used in a numeric context, then the result is
returned as a decimal, real, or integer value.
Note: The syntax of the
CASE
expression shown
here differs slightly from that of the SQL
CASE
statement
described in Section 19.2.10.2, “CASE
Statement”, for use inside
stored routines. The CASE
statement cannot
have an ELSE NULL
clause, and it is
terminated with END CASE
instead of
END
.
-
IF(expr1
,expr2
,expr3
)
If expr1
is TRUE
(expr1
<>
0
and expr1
<> NULL
) then IF()
returns
expr2
; otherwise it returns
expr3
. IF()
returns a numeric or string value, depending on the context in
which it is used.
mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,'yes','no');
-> 'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
-> 'no'
If only one of expr2
or
expr3
is explicitly
NULL
, the result type of the
IF()
function is the type of the
non-NULL
expression.
expr1
is evaluated as an integer
value, which means that if you are testing floating-point or
string values, you should do so using a comparison operation.
mysql> SELECT IF(0.1,1,0);
-> 0
mysql> SELECT IF(0.1<>0,1,0);
-> 1
In the first case shown, IF(0.1)
returns
0
because 0.1
is
converted to an integer value, resulting in a test of
IF(0)
. This may not be what you expect. In
the second case, the comparison tests the original
floating-point value to see whether it is non-zero. The result
of the comparison is used as an integer.
The default return type of IF()
(which may
matter when it is stored into a temporary table) is calculated
as follows:
If expr2
and
expr3
are both strings, the result
is case sensitive if either string is case sensitive.
Note: There is also an
IF
statement, which
differs from the IF()
function described here. See
Section 19.2.10.1, “IF
Statement”.
-
IFNULL(expr1
,expr2
)
If expr1
is not
NULL
, IFNULL()
returns
expr1
; otherwise it returns
expr2
. IFNULL()
returns a numeric or string value, depending on the context in
which it is used.
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,'yes');
-> 'yes'
The default result value of
IFNULL(expr1
,expr2
)
is the more “general” of the two expressions, in
the order STRING
, REAL
,
or INTEGER
. Consider the case of a table
based on expressions or where MySQL must internally store a
value returned by IFNULL()
in a temporary
table:
mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
mysql> DESCRIBE tmp;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| test | char(4) | | | | |
+-------+---------+------+-----+---------+-------+
In this example, the type of the test
column is CHAR(4)
.
-
NULLIF(expr1
,expr2
)
Returns NULL
if
expr1
=
expr2
is true, otherwise
returns expr1
. This is the same as
CASE WHEN expr1
=
expr2
THEN NULL ELSE
expr1
END
.
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
Note that MySQL evaluates expr1
twice if the arguments are not equal.