CASE式を利用して条件分岐するSQLを書く

MySQLで、とある項目の内容によって表示結果を変えるSQLを用意する必要があって調べてみました。例えば「1-100のランダムの整数を求めて 50 超過なら 1 を、それ以外なら 0 を返したい」などです。

mysql> SELECT CASE WHEN (TRUNCATE( RAND() * 99, 0 ) + 1) > 50 THEN 1 ELSE 0 END AS Result;
+--------+
| Result |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)

ELSE句が記述されていない場合で、WHEN句が適合しない場合は以下のように NULL が返ります。

mysql> SELECT CASE WHEN (TRUNCATE( RAND() * 99, 0 ) + 1) = 0 THEN 1 END AS Result;
+--------+
| Result |
+--------+
|   NULL |
+--------+
1 row in set (0.00 sec)

MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.2 制御フロー関数では

CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END

という書式も紹介されていますが(というかこちらの書式の方が前に紹介されてますが)、この場合は value と compare_value の内容がマッチすると THEN で指定した値が返ります。

mysql> SELECT CASE 0 WHEN 10 % 2 THEN 'true' ELSE 'false' END AS Result;
+--------+
| Result |
+--------+
| true   |
+--------+
1 row in set (0.00 sec)

WHEN 〜 THEN 〜 は複数設置できるので複数の条件分岐が可能です。

mysql> SELECT CASE 3 WHEN 1 THEN '*' WHEN 2 THEN '**' WHEN 3 THEN '***' ELSE '-' END AS Resut;
+-------+
| Resut |
+-------+
| ***   |
+-------+
1 row in set (0.00 sec)

mysql> SELECT CASE WHEN 1 + 1 = 1 THEN '*' WHEN 2 THEN '**' WHEN 3 THEN '***' ELSE '-' END AS Resut;
+-------+
| Resut |
+-------+
| **    |
+-------+
1 row in set (0.00 sec)

参照URL