MySQL SELECT ステートメントにおける IF 文:カラム値に基づいて出力値を選択する

2024-04-02

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


SQLでWHERE句とGROUP BY句を使ってデータをフィルタリングする方法

以下の環境を用意する必要があります。データベース (MySQL、PostgreSQL、SQLiteなど)SQL クエリを実行できるツール (MySQL Workbench、pgAdmin、DB Browser for SQLiteなど)このチュートリアルでは、以下のサンプルデータを使用します。...


ハヤシもはやしもしっかり抽出!PostgreSQLで賢く大文字小文字を無視した文字列検索

lower関数とILIKE句の使用最も一般的な方法は、lower() 関数を使用して両方の文字列を小文字に変換し、その後 ILIKE 句で比較する方法です。この例では、users テーブル内の name 列において、'ハヤシ'を含むすべてのレコードが抽出されます。大文字小文字が区別されないため、'ハヤシ'、'ハヤシ'、'HAYASHI' など、あらゆる表記のレコードが抽出されます。...


SQL RANK() と ROW_NUMBER() の違いを徹底解説!

順序の割り当て方法RANK() は、同じ値を持つ行に同じ順位を割り当て、その後順位を連続して割り当てます。ROW_NUMBER() は、行の出現順序に基づいて順位を割り当て、すべての行に一意の番号を割り当てます。同率順位の扱いROW_NUMBER() は、同じ値を持つ行であっても、行の出現順序に基づいて異なる順位を割り当てます。...


MySQL初心者でもわかる!テーブル全体を検索してテキストを置換する方法

このチュートリアルでは、MySQLクエリを使用してテーブル全体でテキストを検索して置換する方法について説明します。必要環境MySQLデータベースMySQLコマンドラインツールまたはphpMyAdmin手順検索と置換を行うテーブルを選択REPLACE() 関数を使用して、検索と置換を行うクエリを作成...


【MariaDB完全攻略】ゼロパディングで文字列を整形!データベース活用テクニック

データ準備まず、サンプルデータを含むテーブルを作成します。この例では、次のテーブルを使用します。次に、サンプルデータを挿入します。ゼロ挿入クエリ以下のクエリを使用して、文字と数字の間にゼロを挿入します。このクエリは、以下の手順を実行します。...