SQLのCASE式は条件分岐を行うときに使います。
本記事ではCASE式の機能について具体例を交えて解説します。今後のSQL学習の参考にしてみてください。
CASE式とは?
SQLのCASE式とは、SELECT句やUPDATE句などのSQL文中で「条件分岐処理」を行うのに用いられるクエリ(命令文)です。CASE式はデータごとに指定条件にあてはまるかを判定し、判定結果に応じて異なる処理を行います。CASE式を使うことでクエリの柔軟性が高まり、簡単に条件分岐ができます。
条件に応じた結果の取得やデータの加工といったデータ操作を容易にする非常に便利な機能なので、この機会にぜひ覚えておきましょう。
≫まずは簡単60秒で無料お問い合わせから≪
WHERE句やHAVING句との違い
WHERE句やHAVING句でも条件を指定してデータの絞り込みを行えますが、出力結果に対して処理を加えるといったことはできません。その点、CASE式では指定した条件を元に何かしらの処理を加えられます。
たとえば、テストの点数が60点以上の生徒には”合格”、60点未満の生徒には”不合格”という文字列を出力させることもできます。
CASE式を使用する上での注意点
指定条件は明確に示し、指定条件同士が排他的であるようにすることが重要です。そうすることで可読性が上がり、ミスも起こりにくくなります。
CASE式の使い方
CASE式は、条件に対する判定結果に応じて動的な出力結果を生成します。
CASE式の基本的な使い方は次のようになります。
【サンプルコード】
SELECT 1または[カラム名] //すべてまたは特定のカラムを取得
CASE [カラム名] //[カラム名]を対象として条件分岐
WHEN [条件A] THEN [処理A] //条件Aを満たす場合に処理A(表示する内容)を行う
WHEN [条件B] THEN [処理B] //条件Bを満たす場合に処理B(表示する内容)を行う
ELSE [処理C] //上記条件を満たさない場合に処理C(表示する内容)を行う
END AS [~] //CASE式のカラムを"~"というカラム名にする
FROM [テーブル名]; //[テーブル名]から取得
◆CASE式の記述ルール
CASE式では「CASE」と「END」で囲まれた箇所に条件分岐を書きます。つまり、以下の部分が条件分岐となります。
WHEN [条件] THEN [条件を満たす場合に表示する内容]
ELSE [上記条件を満たさない場合に表示する内容]
条件は複数指定できます。その場合、最初に一致した条件に対応する結果を返し、それ以降の条件は評価されません。また、どの条件にも当てはまらない場合の処理には「ELSE」を使います。マストではありませんが、指定しない場合は無条件で「ELSE NULL」となってしまい、バグの発生元になりかねないのでつけるのがベターです。
単純CASE式と検索CASE式
CASE式には単純CASE式と検索CASE式の2種類があります。
単純CASE式とは
単純CASE式は特定の値を条件として、その値に一致するか否かを判断します。一致する値がある場合はそれに対応する結果を返し、ない場合は、ELSEで指定されたデフォルト結果を返します。そのため、値によって結果を分岐させる場合にこの単純CASE式が用いられます。
◆単純CASE式のサンプルコード
SELECT 1 //すべてのカラムを取得
CASE [カラム名] //[カラム名]を対象として条件分岐
WHEN [値A] THEN [処理A] //値Aの場合に処理A(表示する内容)を行う
WHEN [値B] THEN [処理B] //値Bを満たす場合に処理B(表示する内容)を行う
ELSE [処理C] //上記値でない場合に処理C(表示する内容)を行う
END AS [~] //CASE式のカラムを"~"というカラム名にする
FROM [テーブル名]; //[テーブル名]から取得
◆具体例
CASE 性別
WHEN '男' THEN 1
WHEN '女' THEN 2
ELSE 0
END
上記の例ではgender列の値に応じて異なる結果を返しています。’男’の場合は「1」、’女’の場合は「2」、それ以外の場合は「0」という表示になります。
単純CASE式の特徴
- 簡潔な表現ができて可読性が高い
- 等価条件が真であるか判別するのみでできることが限定的
- 応用が利きづらい
検索CASE式とは
検索CASE式は値ではなく、指定された条件をもとに評価し、結果を返します。単純CASE式は一致のみですが、検索CASE式は不等号やNULL値、ほかのSQL関数や演算子と組み合わせることもでき、さまざまな条件式で判別可能です。
そのため、任意の条件によって結果を分岐させる場合に検索CASE式が用いられます。
◆検索CASE式のサンプルコード
SELECT 1 //すべてのカラムを取得
CASE [カラム名] //[カラム名]を対象として条件分岐
WHEN [条件A] THEN [処理A] //条件Aを満たす場合に処理A(表示する内容)を行う
WHEN [条件B] THEN [処理B] //条件Bを満たす場合に処理B(表示する内容)を行う
ELSE [処理C] //上記条件を満たさない場合に処理C(表示する内容)を行う
END AS [~] //CASE式のカラムを"~"というカラム名にする
FROM [テーブル名]; //[テーブル名]から取得
◆具体例
CASE
WHEN 性別 = '男' THEN 1
WHEN 性別 = '女' THEN 2
ELSE 0
END
書き方は単純CASE式と異なりますが、処理内容は同じです。
検索CASE式の特徴
- 等価条件のほかにさまざまな条件式が利用できる
- 表現の幅が広い
- コードが複雑化しやすい
【まとめ】単純CASE式と検索CASE式
- 単純CASE式は等号のみ評価できる
- 検索CASE式は等号に加えて不等号やNULLも評価できる
【サンプルテーブル】
ここからはCASE式の具体的な使い方を解説していきます。説明には、サンプルとして「テスト」テーブルを用意しました。
「テスト」テーブル
id | 氏名 | 性別 | 点数 |
1001 | 秋山 | 男 | 80 |
1002 | 久保田 | 女 | 100 |
1003 | 佐々木 | 女 | NULL |
1004 | 佐藤 | 男 | 75 |
1005 | 鈴木 | 女 | 60 |
1006 | 田中 | 男 | 90 |
1007 | 土屋 | 女 | 55 |
【補足】テーブルの準備
テーブルの作成には、各カラムのデータ型の指定と主キー(プライマリーキー)を指定します。上記のサンプルテーブルをSQLで作成するには以下のように記述します。
CREATE TABLE テスト (
id integer primary key,
氏名 text,
性別 text,
点数 integer
);
テーブルが完成したら各フィールドにデータを入れていきます。
INSERT INTO テスト (id, 氏名, 性別, 点数) VALUES (1001, '秋山', '男', 80);
INSERT INTO テスト (id, 氏名, 性別, 点数) VALUES (1002, '久保田', '女', 100);
INSERT INTO テスト (id, 氏名, 性別, 点数) VALUES (1003, '佐々木', '女', NULL);
INSERT INTO テスト (id, 氏名, 性別, 点数) VALUES (1004, '佐藤', '男', 75);
INSERT INTO テスト (id, 氏名, 性別, 点数) VALUES (1005, '鈴木', '女', 60);
INSERT INTO テスト (id, 氏名, 性別, 点数) VALUES (1006, '田中', '男', 90);
INSERT INTO テスト (id, 氏名, 性別, 点数) VALUES (1007, '土屋', '女', 55);
以上でテーブルの準備が完了しました。
等式
先ほど、単純CASE式/検索CASE式で具体例として挙げたものを検索CASE式で実行します。
【実行コード】
SELECT id,氏名,性別,
CASE 性別
WHEN 性別 = '男' THEN 1
WHEN 性別 = '女' THEN 2
ELSE 0
END AS 性別2
FROM テスト;
【実行結果】
id | 氏名 | 性別 | 性別2 |
1001 | 秋山 | 男 | 1 |
1002 | 久保田 | 女 | 2 |
1003 | 佐々木 | 女 | 2 |
1004 | 佐藤 | 男 | 1 |
1005 | 鈴木 | 女 | 2 |
1006 | 田中 | 男 | 1 |
1007 | 土屋 | 女 | 2 |
不等式
不等式を用いた条件をつけて実行します。下記のコードはテストの点数ごとに成績を付けています。
【実行コード】
SELECT id,氏名,点数,
CASE 点数
WHEN 点数 >= 90 THEN '秀'
WHEN 点数 >= 80 THEN '優'
WHEN 点数 >= 70 THEN '良'
WHEN 点数 >= 60 THEN '可'
ELSE 不可
END AS 成績
FROM テスト;
前述したように、最初にあてはまった条件に対応する結果を返し、それ以降の条件は評価されないので、90点以上であれば、「秀」となります。
【実行結果】
id | 氏名 | 点数 | 成績 |
1001 | 秋山 | 80 | 優 |
1002 | 久保田 | 100 | 秀 |
1003 | 佐々木 | NULL | 不可 |
1004 | 佐藤 | 75 | 良 |
1005 | 鈴木 | 60 | 可 |
1006 | 田中 | 90 | 秀 |
1007 | 土屋 | 55 | 不可 |
NULL判定
NULL判定には「IS句」を用います。テストを受けていない生徒には「未履修」と表示させます。
【実行コード】
SELECT id,氏名,点数,
CASE 点数
WHEN 点数 >= 90 THEN '秀'
WHEN 点数 >= 80 THEN '優'
WHEN 点数 >= 70 THEN '良'
WHEN 点数 >= 60 THEN '可'
WHEN 点数 IS NULL THEN '未履修
ELSE 不可
END AS 成績
FROM テスト;
【実行結果】
id | 氏名 | 点数 | 成績 |
1001 | 秋山 | 80 | 優 |
1002 | 久保田 | 100 | 秀 |
1003 | 佐々木 | NULL | 未履修 |
1004 | 佐藤 | 75 | 良 |
1005 | 鈴木 | 60 | 可 |
1006 | 田中 | 90 | 秀 |
1007 | 土屋 | 55 | 不可 |
LIKE句で曖昧判定
CASE式の中で曖昧検索を行う「LIKE句」を使うことで、指定した文字列の一部に一致するかといった、柔軟なデータの評価ができます。名前に「田」が含まれているかを調べます。ワイルドカードとしては「%」や「_」を使ってパターンを表現します。
【SQL】データの曖昧検索「LIKE句」の使い方!完全一致・部分一致・否定形も解説
【実行コード】
SELECT 氏名,
CASE
WHEN 氏名 LIKE '%田%' THEN '田が含まれる'
ELSE '田が含まれない'
END AS 氏名判定
FROM テスト;
【実行結果】
氏名 | 氏名判定 |
秋山 | 田が含まれない |
久保田 | 田が含まれる |
佐々木 | 田が含まれない |
佐藤 | 田が含まれない |
鈴木 | 田が含まれない |
田中 | 田が含まれる |
土屋 | 田が含まれない |
入れ子にする
CASEの条件式に中にCASE式を記述するという入れ子(ネスト)にすることもできます。CASE式を入れ子(ネスト)にすることで、より複雑な条件分岐ができます。ここでは、田中さんだけを対象に再度成績を判定します。
【実行コード】
SELECT
氏名,
CASE
WHEN 氏名="田中" THEN
CASE
WHEN 60 <= 点数 THEN "合格"
ELSE "不合格"
END
ELSE "対象ではない"
END AS 合否
FROM テスト;
氏名 | 合否 |
秋山 | 対象ではない |
久保田 | 対象ではない |
佐々木 | 対象ではない |
佐藤 | 対象ではない |
鈴木 | 対象ではない |
田中 | 合格 |
土屋 | 対象ではない |
一つ目のCASE式で、田中さんか否かを判別し、二つ目で点数で合否判定をしています。入れ子は何層にもできますが、階層が複雑になると可読性が下がるのでその点は気をつけましょう。
論理演算子
「AND」や「OR」といった論理演算子を使えば、複数のカラムを連結した条件を指定できます。ここでは、性別が女性で、テストの点数が80点以上の人を判別します。
【実行コード】
SELECT 1
CASE
WHEN 性別 = '女' AND 80 <= 点数 THEN 1
ELSE 0
END AS 判定
FROM テスト;
【実行結果】
id | 氏名 | 性別 | 点数 | 判定 |
1001 | 秋山 | 男 | 80 | 0 |
1002 | 久保田 | 女 | 100 | 1 |
1003 | 佐々木 | 女 | NULL | 0 |
1004 | 佐藤 | 男 | 75 | 0 |
1005 | 鈴木 | 女 | 60 | 0 |
1006 | 田中 | 男 | 90 | 0 |
1007 | 土屋 | 女 | 55 | 0 |
INで複数条件を指定
特定のカラムで複数の条件指定を行なう場合、論理演算子の代わりにIN句の利用もよいでしょう。複数条件がある場合はコード量を減らせて便利です。該当しない要素を調べる場合はNOT IN句を使います。ここでは、特定のIDを判定します。
【実行コード】
SELECT 1
CASE
WHEN id IN (1001,1003,1005) THEN 1
ELSE 0
END AS 判定
FROM テスト;
【実行結果】
id | 氏名 | 性別 | 点数 | 判定 |
1001 | 秋山 | 男 | 80 | 1 |
1002 | 久保田 | 女 | 100 | 0 |
1003 | 佐々木 | 女 | NULL | 1 |
1004 | 佐藤 | 男 | 75 | 0 |
1005 | 鈴木 | 女 | 60 | 1 |
1006 | 田中 | 男 | 90 | 0 |
1007 | 土屋 | 女 | 55 | 0 |
区分ごとの集計
CASE式で出した結果を区分ごとに集計したい場合は、集計関数との連携が有効です。たとえば、CASE式で条件に一致したら1しない場合は0としてSUM関数を使えば、それぞれのレコード数を集計できます。WHERE句で代用することも可能ですが、その場合は2つのSQLが必要になります。ほかにも、MAX関数やMIN関数を用いて最大値や最小値を求めることもできます。ここでは、まず60点以上とそれ以外の人数をそれぞれ集計してからそれぞれの合計数を表示しています。
【実行コード】
SELECT 1
SUM(CASE WHEN 点数 >= 60 THEN 1 ELSE 0 END) AS 合格者数,
SUM(CASE WHEN 点数 < 60 OR 点数 IS NULL THEN 1 ELSE 0 END) AS 不合格者数
FROM テスト;
【実行結果】
合格者数 | 不合格者数 |
5 | 2 |
WHERE句
WHERE句は指定した条件にあてはまるレコードを絞り込む場合に使います。WHERE句の中にCASE式を用いると、データによって条件の指定を切り替えられます。
ここでは、テストの点数が80点以上のとき、性別が男の場合のみ出力します。テストの点数が80点未満であればELSEの条件となり、すべて出力されます。
SELECT 1
FROM テスト
WHERE
CASE WHEN 点数 >= 80 THEN 性別 = '男'
ELSE TRUE
END
テストの点数が80点以上で、性別が男の場合と、テストの点数が80点以上でなく、性別が男の場合が表示されました。逆に80点以上であっても性別が女である場合は表示されません。このようにWHERE句内でCASE式を使うことで複雑な条件分岐ができます。
SELECT * FROM emp WHERE CASE
WHEN comm IS NULL THEN sal
WHEN comm IS NOT NULL THEN sal + comm
END >= 5000;
id | 氏名 | 性別 | 点数 |
1001 | 秋山 | 男 | 80 |
1004 | 佐藤 | 男 | 75 |
1006 | 田中 | 男 | 90 |
ORDER BY句で使用
ORDER BY句はテーブルのレコードの並び替えを行う際に利用します。ORDER BY句内でCASE式を使うことで並び替えの番号を指定できるようになるので任意の順序に並び替えができます。
ここでは、idを任意の順番に並び替えます。通常は数値を昇順または降順で並べるのが一般的ですが、データの形式が文字列である場合などに有効です。
SELECT 1
FROM テスト
ORDER BY
CASE
WHEN id = 1001 THEN 2
WHEN id = 1002 THEN 1
WHEN id = 1003 THEN 3
WHEN id = 1004 THEN 5
WHEN id = 1005 THEN 4
WHEN id = 1006 THEN 6
WHEN id = 1007 THEN 7
ELSE 0
END;
id | 氏名 | 性別 | 点数 |
1002 | 久保田 | 女 | 100 |
1001 | 秋山 | 男 | 80 |
1003 | 佐々木 | 女 | NULL |
1005 | 鈴木 | 女 | 60 |
1004 | 佐藤 | 男 | 75 |
1006 | 田中 | 男 | 90 |
1007 | 土屋 | 女 | 55 |
「UPDATE」でも使用可能
UPDATE文で複数の条件に分岐させたい場合はCASE式を利用しましょう。ここでは、60点未満の人は0点に、60点以上の人は100点にします。
UPDATE 1 SET
点数 =
CASE
WHEN 60 <= 点数 THEN 100
ELSE 0
END;
【実行結果】
id | 氏名 | 性別 | 点数 |
1001 | 秋山 | 男 | 100 |
1002 | 久保田 | 女 | 100 |
1003 | 佐々木 | 女 | 0 |
1004 | 佐藤 | 男 | 100 |
1005 | 鈴木 | 女 | 100 |
1006 | 田中 | 男 | 100 |
1007 | 土屋 | 女 | 0 |
SQLの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。
▼MySQL
【初心者向け】MySQLとは?SQLとの違いやメリット、使用方法をわかりやすく解説
▼WHERE
【SQL入門1】WHEREで検索条件を指定する方法を解説
▼IN
【SQL入門】IN句の使い方やサブクエリの活用方法を解説
▼BETWEEN
【SQL入門3】between演算子で抽出する範囲を指定する
▼EXISTS
【SQL】EXISTSの使い方をサンプルコードで解説
▼COUNT
SQLのCOUNTで数を数える!基礎から応用まで具体例で解説
▼GROUP BY
【SQL】GROUP BY句の使い方をサンプルコードで解説
▼JOIN
【SQL入門】JOINでテーブル結合!種類と使い方を解説
▼DELETE
【SQL】データ削除「DELETE文」の使い方。全件削除・複数テーブル参照も解説
- 2023.09.22
- Other
Author:鷺坂りな @TechMania編集部 投稿一覧
Otherカテゴリの最新記事
-
- 2024.11.15
【Excel VBA】VBAでVLOOKUP関数を使用する方法を解説
-
- 2024.11.15
【Excel VBA】条件付き書式をVBAで追加する方法を解説
-
- 2024.11.08
【VBA】エラーが発生した場合の処理を実装する方法を解説
-
- 2024.11.08
【Excel VBA】MATCH関数でセルの範囲を検索する方法を解説
-
- 2024.11.01
【Excel VBA】Dimステートメントで変数を宣言する方法を解説
-
- 2024.11.01
【Excel VBA】Val関数で文字列を数値に変換する方法を解説