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)