SQL文内で条件分岐をして値を切り替える方法

こんにちは!ぐちです。

SQL

スマホアプリでもWebサービスでも基幹系システムでもほとんどのシステムでデータベースって使われていますよね。現状一番多く使われているのがリレーショナルデータベースと呼ばれる表形式でデータを保持し表同士に関係性を持たせ管理する例のあれです。

そんなリレーショナルデータベースに対して操作を行う言語がSQLなわけですが、データの取得・更新・削除が出来るだけでなく条件分岐まで行うことができるんです。

ゼロとかイチとか

ユーザー情報を管理するテーブルでよく見るのが男女の情報を0とか1で保持していたり、OSの種別を0、1で保持しているのを見ませんか?

そんなテーブルからデータを取得して一覧に表示する際に下記のようなコードをよく見かけます。※PHP(CakePHP)をサンプルに書きます。

$ret = $this->TblDevices->find('all');
foreach ($devices as $key => $device) {
    if($device['os_kind'] == '0') {
        $devices[$key]['os_name'] = 'Android';
    } else if($device['os_kind'] == '1') {
        $devices[$key]['os_name'] = 'iOS';
    } else {
        $devices[$key]['os_name'] = 'Windows';
    }
}

いちいち上記のような判定を行って値を切り替えるのもめんどくさいのでSQLでさくっとできれば可読性も高まりますし間違いも少なくなりますよね。こういう時に使えるSQLの構文がCASE句です。

CASE

まずは下記のSQLを見てください。

SELECT
  CASE
    WHEN os_kind = '0' THEN 'Android'
    WHEN os_kind = '1' THEN 'iOS'
    ELSE 'Windows'
  END AS os_name
FROM tbl_devices;

マスタテーブルを用意すれば?というのは目を瞑って頂くとして(笑)端末種別を0とか1で保持していてデータ取得の際に種別に応じた名称を設定したければ上記のようにCASE文で条件分岐させることができます。

条件は1つ目から順番に評価され真になったタイミングで値が返されます。どの条件文も真にならない場合はELSEの値が返されます。

フレームワーク

フレームワークを利用しているならモデル内で値を返す前に共通処理としてコーディングしても同じことができますが冗長的になったり可読性が落ちたりするので簡単なものであればSQLで対応してしまうのもひとつだと思います。

まとめ

CASE句はデータ取得時以外にも使うことができます。使い方次第では複雑なことまでできますがSQL自体の可読性やシステム側での対応コストとバランスを見ながら活用してもらえればと思います。

では今回はこの辺で。