テーブルのとあるフィールド(列)の値ごとに、SELECTで出力する値を変換したい時があります。
例えば、会員テーブルの性別をいうフィールドに性別を表す数値が登録されていて、性別フィールドの値が「1」なら「男性」という文字列を、「2」なら「女性」という文字列を、その他は「不明」という文字列を取得したい場合などです。
そんな時は、SQLのCASE演算子を使うと、簡単に値を変換することができます。
CASE演算子は、任意の条件に一致する場合に、任意の値に変換することができる便利な演算子です。
テーブルの準備
会員テーブルの定義と、登録されているデータが、以下のようになっているとします。
テーブルの定義
テーブル名 | テーブルID | |
---|---|---|
会員テーブル | TBL_MEMBER | |
No | フィールド名 | フィールドID |
1 | 会員ID | MEMBER_ID |
2 | 性別 | SX_CODE |
3 | 体重 | WEIGHT |
テーブルに登録されているデータ
No | MEMBER_ID | SX_CODE | WEIGHT |
---|---|---|---|
1 | 001 | 1 | 86.1 |
2 | 002 | 2 | 132.8 |
3 | 003 | NULL | 71.9 |
4 | 004 | 2 | 53.6 |
5 | 005 | 1 | 103.8 |
6 | 006 | 1 | 65.4 |
SELECT文の作成と取得結果
会員テーブルの性別フィールドの値によって
- 1 = 男性
- 2 = 女性
- 他 = 不明
という値に変換した値を取得するSQLは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT MEMBER_ID, -- 性別が以下のケースについて CASE SX_CODE -- 1なら WHEN 1 THEN '男性' -- 2なら WHEN 2 THEN '女性' -- その他なら ELSE '不明' END AS SEIBETSU FROM TBL_MEMBER |
のようになり
No | MEMBER_ID | SEIBETSU |
---|---|---|
1 | 001 | 男性 |
2 | 002 | 女性 |
3 | 003 | 不明 |
4 | 004 | 女性 |
5 | 005 | 男性 |
6 | 006 | 男性 |
のような結果が取得できます。
[CASE SX_CODE WHEN 1 THEN ‘男性’] の部分は
[CASE WHEN SX_CODE = 1 THEN ‘男性’] と記述することもできます。
SQLを変更して
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT MEMBER_ID, -- 以下のケースについて CASE -- 性別が1なら WHEN SX_CODE = 1 THEN '男性' -- 性別が2なら WHEN SX_CODE = 2 THEN '女性' -- その他なら ELSE '不明' END AS SEIBETSU FROM TBL_MEMBER |
と記述しても同じ結果が取得できます。
CASE WHEN 式 THEN の形式
[CASE WHEN フィールド = 条件値 THEN 変換値] の
[フィールド = 条件値] の部分は「式」なので [=] の他に、[<] [>] [<=] [>=] を使うこともできます。
会員テーブルを使って、会員の「体重(WEIGHT)」が100kg以上の場合は「特別メニュー」、100kg未満の場合は「通常メニュー」という値を取得するには
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT MEMBER_ID, WEIGHT, -- 以下のケースについて CASE -- 100kg以上の場合 WHEN 100 <= WEIGHT THEN '特別メニュー' -- 100kg未満の場合 ELSE '通常メニュー' END AS MENU FROM TBL_MEMBER |
というSQLを記述することで
No | MEMBER_ID | WEIGHT | MENU |
---|---|---|---|
1 | 001 | 86.1 | 通常メニュー |
2 | 002 | 132.8 | 特別メニュー |
3 | 003 | 71.9 | 通常メニュー |
4 | 004 | 53.6 | 通常メニュー |
5 | 005 | 103.8 | 特別メニュー |
6 | 006 | 65.4 | 通常メニュー |
のような結果が取得できます。
ちなみにSQLのCASE演算子は、SELECT句だけでなく、FROM句、WHERE句などでも使うことができます。