CASE WHEN構文:MySQLユーザー必見のIf Else条件構文
SQLiteには、If Else条件構文を用いて、条件分岐処理を実現する機能が備わっています。この機能を使いこなすことで、より複雑なデータ処理を記述することができます。
基本的な構文
SQLiteにおけるIf Else条件構文の基本的な形式は以下の通りです。
CASE
WHEN <条件1> THEN <処理1>
WHEN <条件2> THEN <処理2>
...
ELSE <処理N>
END
この構文は、CASEキーワードで始まり、WHENキーワードとTHENキーワードを用いて条件と処理を記述します。ELSEキーワードは、すべての条件に合致しなかった場合の処理を記述するために使用されます。
例えば、以下のSQLは、列age
の値に基づいて、ユーザーの年齢区分を判定し、メッセージを出力する例です。
SELECT
CASE
WHEN age < 18 THEN '未成年'
WHEN age < 65 THEN '成人'
ELSE '高齢者'
END AS age_group
FROM users;
このSQLは、users
テーブルからage
列と、CASE式で計算されたage_group
列を取得します。CASE式は、age
列の値に基づいて、以下の処理を実行します。
age
が18歳未満の場合:未成年
という文字列を出力- それ以外の場合は:
高齢者
という文字列を出力
複合条件
WHEN句では、複数の条件を組み合わせて記述することができます。ANDキーワードとORキーワードを用いて、論理積と論理和を表現できます。
SELECT
CASE
WHEN age < 18 AND gender = 'male' THEN '未成年男性'
WHEN age < 18 AND gender = 'female' THEN '未成年女性'
WHEN age < 65 AND gender = 'male' THEN '成人男性'
WHEN age < 65 AND gender = 'female' THEN '成人女性'
ELSE '高齢者'
END AS user_type
FROM users;
CASE式は、その他の関数と組み合わせて、より複雑な処理を実現することができます。例えば、以下のSQLは、age
列の値に基づいて、ユーザーの年齢区分を判定し、割引率を計算する例です。
SELECT
age,
CASE
WHEN age < 18 THEN 0.5
WHEN age < 65 THEN 0.2
ELSE 0.1
END AS discount_rate
FROM users;
age
が18歳未満の場合: 割引率50%を計算- それ以外の場合は: 割引率10%を計算
SQLiteにおけるIf Else条件構文は、CASEキーワードを用いて記述できます。WHEN
商品テーブルのサンプルデータ
CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price INTEGER NOT NULL,
category TEXT NOT NULL
);
INSERT INTO products (name, price, category) VALUES
('T-shirt', 1000, 'Clothing'),
('Smartphone', 50000, 'Electronics'),
('Book', 2000, 'Books'),
('Coffee', 500, 'Food'),
('Chair', 10000, 'Furniture');
商品カテゴリによる価格帯判定
以下のサンプルコードは、CASE式を用いて、商品カテゴリに基づいて価格帯を判定し、結果を出力する例です。
SELECT
name,
price,
CASE
WHEN category = 'Clothing' THEN '衣類'
WHEN category = 'Electronics' THEN '家電'
WHEN category = 'Books' THEN '書籍'
WHEN category = 'Food' THEN '食品'
ELSE '家具'
END AS category_name,
CASE
WHEN price < 1000 THEN '安い'
WHEN price < 10000 THEN '普通'
ELSE '高い'
END AS price_range
FROM products;
このSQLは、products
テーブルからname
列、price
列、CASE式で計算されたcategory_name
列とprice_range
列を取得します。
- CASE式は、
category
列の値に基づいて、商品カテゴリを日本語で出力します。 - 別のCASE式は、
price
列の値に基づいて、価格帯を判定し、日本語で出力します。
実行結果は、以下のようになります。
| name | price | category_name | price_range |
|--------------|-------|--------------|-------------|
| T-shirt | 1000 | 衣類 | 安い |
| Smartphone | 50000 | 家電 | 高い |
| Book | 2000 | 書籍 | 安い |
| Coffee | 500 | 食品 | 安い |
| Chair | 10000 | 家具 | 普通 |
顧客の年齢と購入金額による割引率計算
SELECT
name,
age,
purchase_amount,
CASE
WHEN age < 18 THEN 0.5
WHEN age < 65 THEN 0.2
ELSE 0.1
END AS discount_rate,
purchase_amount * (1 - discount_rate) AS discounted_price
FROM customers;
このSQLは、customers
テーブルからname
列、age
列、purchase_amount
列、CASE式で計算されたdiscount_rate
列とdiscounted_price
列を取得します。
- CASE式は、
age
列の値に基づいて、顧客の年齢区分に応じた割引率を計算します。 discounted_price
列は、購入金額に割引率を乗じて、割引後の価格を計算します。
| name | age | purchase_amount | discount_rate | discounted_price |
|--------------|-------|---------------|-------------|-------------|
| John Doe | 20 | 10000 | 0.5 | 5000 |
| Jane Doe | 40 | 20000 | 0.2 | 16000 |
| Mike Smith | 65 | 30000 | 0.1 | 27000 |
上記のサンプルコードは、SQLiteにおけるIf Else条件構文の
SQLiteにおけるIf Else条件構文の代替方法
IIF関数は、条件式に基づいて、2つの値のいずれかを出力する関数です。以下の例は、CASE式を用いて記述したサンプルコードをIIF関数で書き換えたものです。
SELECT
name,
price,
IIF(category = 'Clothing', '衣類', IIF(category = 'Electronics', '家電', 'その他')),
IIF(price < 1000, '安い', IIF(price < 10000, '普通', '高い'))
FROM products;
IIF関数は、CASE式よりも簡潔に記述できますが、ネストできるレベルが浅いため、複雑な条件分岐には不向きです。
CASE WHEN構文は、MySQLなどの他のデータベースでよく用いられるIf Else条件構文です。以下の例は、CASE式を用いて記述したサンプルコードをCASE WHEN構文で書き換えたものです。
SELECT
name,
price,
CASE WHEN category = 'Clothing' THEN '衣類'
WHEN category = 'Electronics' THEN '家電'
ELSE 'その他'
END AS category_name,
CASE WHEN price < 1000 THEN '安い'
WHEN price < 10000 THEN '普通'
ELSE '高い'
END AS price_range
FROM products;
CASE WHEN構文は、CASE式とほぼ同じ機能を持ちますが、CASE式よりも記述が冗長になる場合があり、可読性が低下する可能性があります。
サブクエリを用いて、条件分岐処理を実現することも可能です。以下の例は、CASE式を用いて記述したサンプルコードをサブクエリで書き換えたものです。
SELECT
name,
price,
(SELECT category_name FROM categories WHERE category = p.category) AS category_name,
(SELECT price_range FROM price_ranges WHERE price BETWEEN min_price AND max_price) AS price_range
FROM products AS p
JOIN categories ON categories.id = p.category_id
JOIN price_ranges ON price_ranges.id = p.price_range_id;
サブクエリを用いる方法は、複雑な条件分岐処理にも対応できますが、記述が複雑になり、可読性が低下する可能性があります。
どの方法を選択するべきかは、条件分岐処理の複雑さや可読性などを考慮して決定する必要があります。
- シンプルな条件分岐処理の場合は、IIF関数が最も簡潔に記述できます。
- 複雑な条件分岐処理の場合は、CASE式またはサブクエリを用いることができます。
- 可読性を重視する場合は、CASE WHEN構文を用いることができます。
それぞれの方法のメリットとデメリットを理解し、状況に応じて使い分けることが重要です。
sql sqlite