MySQL SELECT ステートメントにおける IF 文:カラム値に基づいて出力値を選択する
MySQL の SELECT ステートメントでは、IF
文を使用して、カラム値に基づいて出力値を選択することができます。これは、条件によって異なる値を表示したい場合に便利です。
例
以下の例では、products
テーブルから商品名と価格を取得し、価格が 1000 円以上の場合は "高額商品"、それ以下の場合は "低額商品" と表示します。
SELECT
product_name,
price,
IF(price >= 1000, '高額商品', '低額商品') AS price_category
FROM products;
出力例
商品名 | 価格 | 価格帯
------- | -------- | --------
商品A | 1200円 | 高額商品
商品B | 800円 | 低額商品
構文
IF
文の構文は以下の通りです。
IF(condition, true_value, false_value)
condition
: 条件式true_value
: 条件が真の場合に出力する値
条件式は、数値比較、文字列比較、論理演算子などを組み合わせて記述することができます。
- 価格が 1000 円以上の場合:
price >= 1000
- 商品名が "商品A" の場合:
product_name = '商品A'
- 在庫数が 0 以下の場合:
stock <= 0
CASE 文との比較
IF
文と同様に、CASE
文を使用して条件分岐を行うこともできます。CASE
文は、複数の条件をより複雑に分岐させる場合に適しています。
以下の例では、CASE
文を使用して、価格帯によって異なる値を表示します。
SELECT
product_name,
price,
CASE
WHEN price >= 1000 THEN '高額商品'
WHEN price >= 500 THEN '中額商品'
ELSE '低額商品'
END AS price_category
FROM products;
IF
文と CASE
文を使いこなすことで、SELECT ステートメントの出力結果をより柔軟に制御することができます。条件によって異なる値を表示したい場合に、これらの機能を活用しましょう。
SELECT
product_name,
price,
IF(price >= 1000, '高額商品', '低額商品') AS price_category
FROM products;
商品名 | 価格 | 価格帯
------- | -------- | --------
商品A | 1200円 | 高額商品
商品B | 800円 | 低額商品
会員の年齢区分を表示
SELECT
name,
age,
CASE
WHEN age >= 60 THEN '高齢者'
WHEN age >= 18 THEN '成人'
ELSE '未成年'
END AS age_group
FROM members;
名前 | 年齢 | 年齢区分
------- | -------- | --------
田中 | 25歳 | 成人
佐藤 | 70歳 | 高齢者
高橋 | 15歳 | 未成年
在庫状況に基づいてメッセージを表示
SELECT
product_name,
stock,
CASE
WHEN stock > 0 THEN '在庫あり'
ELSE '在庫なし'
END AS stock_status
FROM products;
商品名 | 在庫 | 在庫状況
------- | -------- | --------
商品A | 10個 | 在庫あり
商品B | 0個 | 在庫なし
NULL 値を処理
SELECT
product_name,
price,
IFNULL(price, '価格情報なし') AS price_info
FROM products;
商品名 | 価格 | 価格情報
------- | -------- | --------
商品A | 1200円 | 1200円
商品B | NULL | 価格情報なし
文字列比較
SELECT
product_name,
category,
IF(category = '食品', '食料品', 'その他') AS category_type
FROM products;
商品名 | カテゴリー | カテゴリータイプ
------- | -------- | --------
商品A | 食品 | 食料品
商品B | 日用品 | その他
論理演算子
SELECT
product_name,
price,
IF(price >= 1000 AND stock > 0, '購入可能', '購入不可') AS purchase_status
FROM products;
商品名 | 価格 | 購入状況
------- | -------- | --------
商品A | 1200円 | 購入可能
商品B | 800円 | 購入不可
サブクエリ
SELECT
product_name,
(SELECT AVG(price) FROM products WHERE category = p.category) AS average_price,
IF(price > average_price, '高価格', '低価格') AS price_category
FROM products AS p;
商品名 | 平均価格 | 価格帯
------- | -------- | --------
商品A | 1000円 | 高価格
商品B | 800円 | 低価格
CASE WHEN THEN END
SELECT
product_name,
price,
CASE WHEN price >= 1000 THEN '高額商品'
WHEN price >= 500 THEN '中額商品'
ELSE '低額商品'
END AS price_category
FROM products;
商品名 | 価格 | 価格帯
------- | -------- | --------
商品A | 1200円 | 高額商品
商品B | 800円 | 中額商品
BETWEEN
SELECT
product_name,
price,
CASE WHEN price BETWEEN 500 AND 1000 THEN '中額商品'
ELSE 'その他'
END AS price_category
FROM products;
商品名 | 価格 | 価格帯
------- | -------- | --------
商品A | 1200円 | その他
商品B | 800円 | 中額商品
IN
SELECT
product_name,
category
CASE WHEN THEN ELSE END を使ったネスト
SELECT
product_name,
price,
CASE WHEN price >= 1000 THEN
CASE WHEN category = '食品' THEN '高額食品'
ELSE '高額商品'
END
ELSE '低額商品'
END AS price_category
FROM products;
関数を条件式に使う
SELECT
product_name,
price,
IF(LENGTH(product_name) > 10, '長い商品名', '短い商品名') AS name_length
FROM products;
GROUP BY と CASE WHEN THEN END を使う
SELECT
category,
AVG(price) AS average_price,
CASE WHEN AVG(price) >= 1000 THEN '高価格帯'
ELSE '低価格帯'
END AS price_category
FROM products
GROUP BY category;
SELECT
product_name,
price,
(SELECT MAX(price) FROM products WHERE category = p.category) AS max_price,
CASE WHEN price = max_price THEN '最高価格商品'
ELSE 'その他'
END AS price_rank
FROM products AS p;
ユーザー定義関数を使う
CREATE FUNCTION is_high_price(price INT) RETURNS VARCHAR(10)
BEGIN
IF price >= 1000 THEN
RETURN '高額';
ELSE
RETURN '低額';
END IF;
END;
SELECT
product_name,
price,
is_high_price(price) AS price_category
FROM products;
SELECT
p.product_name,
p.price,
c.category_name,
CASE WHEN p.category = c.category_id THEN 'カテゴリー一致'
ELSE 'カテゴリー不一致'
END AS category_match
FROM products AS p
LEFT JOIN categories AS c ON p.category = c.category_id;
SELECT
product_name,
price,
ROW_NUMBER() OVER (ORDER BY price DESC) AS price_rank,
CASE WHEN price_rank = 1 THEN '最高価格商品'
ELSE 'その他'
END AS price_rank
FROM products;
CREATE TEMPORARY TABLE tmp_products AS
SELECT
product_name,
price,
CASE WHEN price >= 1000 THEN '高額商品'
ELSE '低額商品'
END AS price_category
FROM products;
SELECT
product_name,
price_category
FROM tmp_products;
これらの方法は、それぞれ異なる利点と欠点があります。状況に合わせて適切な方法を選択してください。
mysql sql database