今回は、CASE式について説明します。プログラムの条件分岐といえばIF文ですが、SQLで条件分岐をするにはCASE式を使います。
データ準備
CASE式を試すために、テーブルを作成しデータを追加します。
-- 商品テーブルの作成
CREATE TABLE products (
product_id NUMBER PRIMARY KEY,
product_name VARCHAR2(50)
);
-- 在庫テーブルの作成
CREATE TABLE inventory (
product_id NUMBER,
stock_quantity NUMBER
);
-- データ追加 (商品テーブル)
INSERT
ALL INTO products
VALUES
(1, 'イヤホン')
INTO
products
VALUES
(2, 'パソコン')
INTO
products
VALUES
(3, 'キーボード')
INTO
products
VALUES
(4, 'マウス')
INTO
products
VALUES
(5, 'カメラ')
SELECT
*
FROM
DUAL;
-- データ追加 (在庫テーブル)
INSERT
ALL INTO inventory
VALUES
(1, 10)
INTO
inventory
VALUES
(2, 0)
INTO
inventory
VALUES
(3, 5)
INTO
inventory
VALUES
(4, 3)
INTO
inventory
VALUES
(5, 8)
SELECT
*
FROM
DUAL;
商品番号 | 商品名 |
---|---|
1 | イヤホン |
2 | パソコン |
3 | キーボード |
4 | マウス |
5 | カメラ |
商品番号 | 在庫数 |
---|---|
1 | 10 |
2 | 0 |
3 | 5 |
4 | 3 |
5 | 8 |
では、CASE式を使って商品の在庫有無を判定をしてみたいと思います!
CASE式の基本的な使い方
CASE式の基本的な書き方は下記になります。
SELECT
CASE
WHEN 条 件1 THEN 結果1
WHEN 条 件2 THEN 結果2
ELSE 結果3 -- (条件1、2以外)
END
FROM
テ ー ブ ル 名
CASE式を書くときは必ずCASEから始まりENDで終えなければいけません。もし、ENDがなかったらエラー(※)が発生します。WHEN 条件 THEN 結果 で条件に当てはまれば結果を返してくれます。
※ORA-00905: missing keyword
では、在庫有無を確認してみましょう!
SELECT
p.product_name AS "商品名",
i.stock_quantity AS "在庫数",
CASE
WHEN i.stock_quantity > 0 THEN '在庫有り'
ELSE '在庫無し'
END AS "在庫有無"
FROM
products p
JOIN inventory i ON p.product_id = i.product_id
商品名 | 在庫数 | 在庫有無 |
---|---|---|
イヤホン | 10 | 在庫有り |
パソコン | 0 | 在庫無し |
キーボード | 5 | 在庫有り |
マウス | 3 | 在庫有り |
カメラ | 8 | 在庫有り |
パソコンの在庫がないことがわかりました!
ELSE ‘在庫無し’ としてますが、 ELSEは省略も可能で、条件に当てはまらないものはNULLになります。
条件は複数指定できますが、条件を書きすぎると処理が重くなります。注意しましょう。
SELECT
p.product_name AS "商品名",
i.stock_quantity AS "在庫数",
CASE
WHEN i.stock_quantity = 0 THEN '×'
WHEN i.stock_quantity <= 5 THEN '△'
WHEN i.stock_quantity > 6 THEN '○'
END AS "判定"
FROM
products p
JOIN inventory i ON p.product_id = i.product_id
商品名 | 在庫数 | 判定 |
---|---|---|
イヤホン | 10 | ○ |
パソコン | 0 | × |
キーボード | 5 | △ |
マウス | 3 | △ |
カメラ | 8 | ○ |
まとめ
CASE式は CASE で始まって END で終わらせる。ELSEは省略できる。条件は複数指定できる。ただし、条件を書きすぎると処理が重くなるので注意が必要!ってことぐらい覚えておきましょう。ぜひ、手を動かしていろいろと試してみてください。
コメント