<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=MySQL_-_CASE%E5%BC%8F</id>
	<title>MySQL - CASE式 - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=MySQL_-_CASE%E5%BC%8F"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=MySQL_-_CASE%E5%BC%8F&amp;action=history"/>
	<updated>2026-04-17T17:41:42Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=MySQL_-_CASE%E5%BC%8F&amp;diff=14279&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == CASE式は、条件分岐を実現するSQLの式であり、&lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;UPDATE&lt;/code&gt;、&lt;code&gt;ORDER BY&lt;/code&gt; 等、様々な句で使用できる。&lt;br&gt; &lt;br&gt; CASE式には、単純CASE式と検索CASE式の2種類がある。&lt;br&gt; 単純CASE式は値の等価比較を行い、検索CASE式は柔軟な条件式を指定できる。&lt;br&gt; &lt;br&gt; CASE式は、上から順に条件を評価し、最初に真となる条件の結果を返す。&lt;…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=MySQL_-_CASE%E5%BC%8F&amp;diff=14279&amp;oldid=prev"/>
		<updated>2026-02-11T23:57:49Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == CASE式は、条件分岐を実現するSQLの式であり、&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt; 等、様々な句で使用できる。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; CASE式には、単純CASE式と検索CASE式の2種類がある。&amp;lt;br&amp;gt; 単純CASE式は値の等価比較を行い、検索CASE式は柔軟な条件式を指定できる。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; CASE式は、上から順に条件を評価し、最初に真となる条件の結果を返す。&amp;lt;…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
CASE式は、条件分岐を実現するSQLの式であり、&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt; 等、様々な句で使用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
CASE式には、単純CASE式と検索CASE式の2種類がある。&amp;lt;br&amp;gt;&lt;br /&gt;
単純CASE式は値の等価比較を行い、検索CASE式は柔軟な条件式を指定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
CASE式は、上から順に条件を評価し、最初に真となる条件の結果を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
全ての条件が偽の場合、&amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; 句で指定した値を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; 句を省略した場合は &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
CASE式のほかに、MySQLでは条件分岐を実現する関数として &amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;IFNULL&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;NULLIF&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;COALESCE&amp;lt;/code&amp;gt; が提供されている。&amp;lt;br&amp;gt;&lt;br /&gt;
これらの関数は、CASE式よりも簡潔に条件分岐を記述できるが、機能は限定的である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
CASE式は、&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; 句での値変換、&amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt; 句でのカスタムソート、&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; 文での条件付き更新、&amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; と組み合わせたカテゴリ別集計等、幅広い用途で使用される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パフォーマンスの点では、&amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; 句でのCASE式はインデックスを活用できないため、&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; 句や &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; 句での使用が効率的である。&amp;lt;br&amp;gt;&lt;br /&gt;
また、&amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; 句の順序を最適化し、マッチ可能性の高い条件を先に配置することにより、評価回数を削減できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 単純CASE式 ==&lt;br /&gt;
単純CASE式は、指定した値と各 &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; 句の値を等価演算子 (=) で比較する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
最初に真となる &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; 句の結果を返し、そこで評価を終了する。&amp;lt;br&amp;gt;&lt;br /&gt;
全ての &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; 句が偽の場合、&amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; 句の値を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; 句を省略した場合は、&amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
単純CASE式の基本構文は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CASE value&lt;br /&gt;
    WHEN compare_value1 THEN result1&lt;br /&gt;
    WHEN compare_value2 THEN result2&lt;br /&gt;
    ...&lt;br /&gt;
    [ELSE default_result]&lt;br /&gt;
 END&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 使用例 ====&lt;br /&gt;
単純CASE式を使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 曜日番号を曜日名に変換&lt;br /&gt;
 SELECT&lt;br /&gt;
    order_id,&lt;br /&gt;
    CASE DAYOFWEEK(ordered_at)&lt;br /&gt;
       WHEN 1 THEN &amp;#039;日曜日&amp;#039;&lt;br /&gt;
       WHEN 2 THEN &amp;#039;月曜日&amp;#039;&lt;br /&gt;
       WHEN 3 THEN &amp;#039;火曜日&amp;#039;&lt;br /&gt;
       WHEN 4 THEN &amp;#039;水曜日&amp;#039;&lt;br /&gt;
       WHEN 5 THEN &amp;#039;木曜日&amp;#039;&lt;br /&gt;
       WHEN 6 THEN &amp;#039;金曜日&amp;#039;&lt;br /&gt;
       WHEN 7 THEN &amp;#039;土曜日&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;不明&amp;#039;&lt;br /&gt;
    END AS weekday&lt;br /&gt;
    FROM orders;&lt;br /&gt;
 &lt;br /&gt;
 # ステータスコードをステータス名に変換&lt;br /&gt;
 SELECT&lt;br /&gt;
    order_id,&lt;br /&gt;
    CASE status&lt;br /&gt;
       WHEN 0 THEN &amp;#039;未処理&amp;#039;&lt;br /&gt;
       WHEN 1 THEN &amp;#039;処理中&amp;#039;&lt;br /&gt;
       WHEN 2 THEN &amp;#039;完了&amp;#039;&lt;br /&gt;
       WHEN 9 THEN &amp;#039;キャンセル&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;不明&amp;#039;&lt;br /&gt;
    END AS status_name&lt;br /&gt;
    FROM orders;&lt;br /&gt;
 &lt;br /&gt;
 # 商品カテゴリIDをカテゴリ名に変換&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_id,&lt;br /&gt;
    product_name,&lt;br /&gt;
    CASE category_id&lt;br /&gt;
       WHEN 1 THEN &amp;#039;家電&amp;#039;&lt;br /&gt;
       WHEN 2 THEN &amp;#039;書籍&amp;#039;&lt;br /&gt;
       WHEN 3 THEN &amp;#039;食品&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;その他&amp;#039;&lt;br /&gt;
    END AS category_name&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
単純CASE式は、等価比較 (=) のみを行うため、範囲指定や不等号を使用した比較はできない。&amp;lt;br&amp;gt;&lt;br /&gt;
このような場合は、検索CASE式を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 検索CASE式 ==&lt;br /&gt;
検索CASE式は、各 &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; 句で柔軟な条件式を指定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
不等号、&amp;lt;code&amp;gt;AND&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;OR&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; 等、様々な条件を指定できるため、単純CASE式よりも汎用性が高い。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
検索CASE式の基本構文は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CASE&lt;br /&gt;
    WHEN condition1 THEN result1&lt;br /&gt;
    WHEN condition2 THEN result2&lt;br /&gt;
    ...&lt;br /&gt;
    [ELSE default_result]&lt;br /&gt;
 END&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 使用例 ====&lt;br /&gt;
検索CASE式を使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 価格帯で商品をカテゴリ分け&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    price,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN price &amp;lt; 1000 THEN &amp;#039;economy&amp;#039;&lt;br /&gt;
       WHEN price &amp;gt;= 1000 AND price &amp;lt; 5000 THEN &amp;#039;standard&amp;#039;&lt;br /&gt;
       WHEN price &amp;gt;= 5000 THEN &amp;#039;premium&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;unknown&amp;#039;&lt;br /&gt;
    END AS price_category&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &lt;br /&gt;
 # 給与範囲でランク付け&lt;br /&gt;
 SELECT&lt;br /&gt;
    name,&lt;br /&gt;
    salary,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN salary &amp;lt; 30000 THEN &amp;#039;ジュニア&amp;#039;&lt;br /&gt;
       WHEN salary &amp;gt;= 30000 AND salary &amp;lt; 60000 THEN &amp;#039;ミドル&amp;#039;&lt;br /&gt;
       WHEN salary &amp;gt;= 60000 THEN &amp;#039;シニア&amp;#039;&lt;br /&gt;
    END AS rank&lt;br /&gt;
    FROM employees;&lt;br /&gt;
 &lt;br /&gt;
 # 在庫状態の判定&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    stock,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN stock = 0 THEN &amp;#039;在庫なし&amp;#039;&lt;br /&gt;
       WHEN stock &amp;gt; 0 AND stock &amp;lt;= 10 THEN &amp;#039;残りわずか&amp;#039;&lt;br /&gt;
       WHEN stock &amp;gt; 10 THEN &amp;#039;在庫あり&amp;#039;&lt;br /&gt;
    END AS stock_status&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== NULLの比較 ====&lt;br /&gt;
NULLの比較には、&amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; または &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt; を使用する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WHEN col = NULL&amp;lt;/code&amp;gt; は常に偽となるため、正しく動作しない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # NULLの正しい比較方法&lt;br /&gt;
 SELECT&lt;br /&gt;
    name,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN manager_id IS NULL THEN &amp;#039;トップ&amp;#039;&lt;br /&gt;
       WHEN manager_id IS NOT NULL THEN &amp;#039;部下あり&amp;#039;&lt;br /&gt;
    END AS position&lt;br /&gt;
    FROM employees;&lt;br /&gt;
 &lt;br /&gt;
 # 誤った例 (col = NULLは常に偽)&lt;br /&gt;
 SELECT&lt;br /&gt;
    name,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN manager_id = NULL THEN &amp;#039;トップ&amp;#039;  # これは動作しない&lt;br /&gt;
       ELSE &amp;#039;部下あり&amp;#039;&lt;br /&gt;
    END AS position&lt;br /&gt;
    FROM employees;&lt;br /&gt;
 &lt;br /&gt;
 # 複数条件でのNULLチェック&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN discount IS NULL THEN &amp;#039;割引なし&amp;#039;&lt;br /&gt;
       WHEN discount &amp;gt; 0 AND discount &amp;lt;= 10 THEN &amp;#039;小割引&amp;#039;&lt;br /&gt;
       WHEN discount &amp;gt; 10 THEN &amp;#039;大割引&amp;#039;&lt;br /&gt;
    END AS discount_status&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IF関数 ==&lt;br /&gt;
&amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; 関数は、3項演算子と等価な機能を提供する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
条件式が真の場合は第2引数を返し、偽またはNULLの場合は第3引数を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
&amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; 関数の基本構文は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 IF(expr, true_val, false_val)&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;expr&amp;lt;/u&amp;gt;&lt;br /&gt;
*: 評価する条件式&lt;br /&gt;
* &amp;lt;u&amp;gt;true_val&amp;lt;/u&amp;gt;&lt;br /&gt;
*: &amp;lt;u&amp;gt;expr&amp;lt;/u&amp;gt; が真の場合に返す値&lt;br /&gt;
* &amp;lt;u&amp;gt;false_val&amp;lt;/u&amp;gt;&lt;br /&gt;
*: &amp;lt;u&amp;gt;expr&amp;lt;/u&amp;gt; が偽 または &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; の場合に返す値&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 使用例 ====&lt;br /&gt;
&amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; 関数を使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 在庫の有無を判定&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    IF(stock &amp;gt; 0, &amp;#039;在庫あり&amp;#039;, &amp;#039;在庫なし&amp;#039;) AS stock_status&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &lt;br /&gt;
 # 性別表示&lt;br /&gt;
 SELECT&lt;br /&gt;
    name,&lt;br /&gt;
    IF(gender = &amp;#039;M&amp;#039;, &amp;#039;男性&amp;#039;, &amp;#039;女性&amp;#039;) AS gender_name&lt;br /&gt;
    FROM users;&lt;br /&gt;
 &lt;br /&gt;
 # 割引適用判定&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    price,&lt;br /&gt;
    IF(price &amp;gt;= 5000, price * 0.9, price) AS sale_price&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &lt;br /&gt;
 # NULL判定&lt;br /&gt;
 SELECT&lt;br /&gt;
    name,&lt;br /&gt;
    IF(email IS NOT NULL, &amp;#039;メールあり&amp;#039;, &amp;#039;メールなし&amp;#039;) AS email_status&lt;br /&gt;
    FROM users;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ネストしたIF関数 ====&lt;br /&gt;
&amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; 関数はネスト (入れ子) できるが可読性が低下するため、&amp;lt;u&amp;gt;複雑な条件分岐にはCASE式を推奨する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # CASE式で書き換え (可読性が高い)&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    price,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN price &amp;lt; 1000 THEN &amp;#039;economy&amp;#039;&lt;br /&gt;
       WHEN price &amp;lt; 5000 THEN &amp;#039;standard&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;premium&amp;#039;&lt;br /&gt;
    END AS price_category&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &lt;br /&gt;
 # ネストしたIF関数 (可読性が低い)&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    price,&lt;br /&gt;
    IF(price &amp;lt; 1000, &amp;#039;economy&amp;#039;,&lt;br /&gt;
       IF(price &amp;lt; 5000, &amp;#039;standard&amp;#039;, &amp;#039;premium&amp;#039;)&lt;br /&gt;
    ) AS price_category&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IFNULL関数 ==&lt;br /&gt;
&amp;lt;code&amp;gt;IFNULL&amp;lt;/code&amp;gt; 関数は、第1引数がNULLの場合に第2引数を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
第1引数がNULLでない場合は、第1引数をそのまま返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
&amp;lt;code&amp;gt;IFNULL&amp;lt;/code&amp;gt; 関数の基本構文は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 IFNULL(expr1, expr2)&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;expr1&amp;lt;/u&amp;gt;&lt;br /&gt;
*: 評価する式&lt;br /&gt;
* &amp;lt;u&amp;gt;expr2&amp;lt;/u&amp;gt;&lt;br /&gt;
*: &amp;lt;u&amp;gt;expr1&amp;lt;/u&amp;gt; が &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;の場合に返す値&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;IFNULL(expr1, expr2)&amp;lt;/code&amp;gt; は、&amp;lt;code&amp;gt;COALESCE(expr1, expr2)&amp;lt;/code&amp;gt; と等価である。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 使用例 ====&lt;br /&gt;
&amp;lt;code&amp;gt;IFNULL&amp;lt;/code&amp;gt; 関数を使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # NULLをデフォルト値に置換&lt;br /&gt;
 SELECT&lt;br /&gt;
    name,&lt;br /&gt;
    IFNULL(phone, &amp;#039;未登録&amp;#039;) AS phone_number&lt;br /&gt;
    FROM users;&lt;br /&gt;
 &lt;br /&gt;
 # NULLを0に置換して集計&lt;br /&gt;
 SELECT&lt;br /&gt;
    user_id,&lt;br /&gt;
    IFNULL(SUM(amount), 0) AS total_amount&lt;br /&gt;
    FROM orders&lt;br /&gt;
    GROUP BY user_id;&lt;br /&gt;
 &lt;br /&gt;
 # NULLを空文字列に置換&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    IFNULL(description, &amp;#039;&amp;#039;) AS description&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ゼロ除算への対応 ====&lt;br /&gt;
&amp;lt;code&amp;gt;IFNULL&amp;lt;/code&amp;gt; 関数は、ゼロ除算のエラーを回避するために使用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # ゼロ除算はNULLを返す&lt;br /&gt;
 SELECT IFNULL(1/0, 10) AS result;&lt;br /&gt;
 # 結果: 10&lt;br /&gt;
 &lt;br /&gt;
 # ゼロ除算を含む計算&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_id,&lt;br /&gt;
    total_sales,&lt;br /&gt;
    total_orders,&lt;br /&gt;
    IFNULL(total_sales / total_orders, 0) AS avg_sales&lt;br /&gt;
    FROM product_stats;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NULLIF関数 ==&lt;br /&gt;
&amp;lt;code&amp;gt;NULLIF&amp;lt;/code&amp;gt; 関数は、2つの引数が等しい場合に &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; を返し、それ以外の場合は第1引数を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
この関数は、特定の値をNULLに変換したい場合に有用である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
&amp;lt;code&amp;gt;NULLIF&amp;lt;/code&amp;gt; 関数の基本構文は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 NULLIF(expr1, expr2)&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;expr1&amp;lt;/u&amp;gt;&lt;br /&gt;
*: 評価する式&lt;br /&gt;
* &amp;lt;u&amp;gt;expr2&amp;lt;/u&amp;gt;&lt;br /&gt;
*: 比較する値&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;NULLIF(expr1, expr2)&amp;lt;/code&amp;gt; は、以下のCASE式と等価である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CASE&lt;br /&gt;
    WHEN expr1 = expr2 THEN NULL&lt;br /&gt;
    ELSE expr1&lt;br /&gt;
 END&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 使用例 ====&lt;br /&gt;
&amp;lt;code&amp;gt;NULLIF&amp;lt;/code&amp;gt; 関数を使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 空文字列をNULLに変換&lt;br /&gt;
 SELECT&lt;br /&gt;
    name,&lt;br /&gt;
    NULLIF(email, &amp;#039;&amp;#039;) AS email&lt;br /&gt;
    FROM users;&lt;br /&gt;
 &lt;br /&gt;
 # 0をNULLに変換&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_id,&lt;br /&gt;
    NULLIF(stock, 0) AS stock&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &lt;br /&gt;
 # 特定の値をNULLに変換&lt;br /&gt;
 SELECT&lt;br /&gt;
    order_id,&lt;br /&gt;
    NULLIF(status, &amp;#039;cancelled&amp;#039;) AS active_status&lt;br /&gt;
    FROM orders;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ゼロ除算の防止 ====&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;NULLIF&amp;lt;/code&amp;gt; 関数は、ゼロ除算を防ぐために使用できる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # ゼロ除算を防止&lt;br /&gt;
 SELECT&lt;br /&gt;
    user_id,&lt;br /&gt;
    total_amount,&lt;br /&gt;
    order_count,&lt;br /&gt;
    total_amount / NULLIF(order_count, 0) AS avg_amount&lt;br /&gt;
    FROM user_stats;&lt;br /&gt;
 # order_countが0の場合、NULLIFは0をNULLに変換するため、除算結果もNULLになる&lt;br /&gt;
 &lt;br /&gt;
 # IFNULLと組み合わせてデフォルト値を設定&lt;br /&gt;
 SELECT&lt;br /&gt;
    user_id,&lt;br /&gt;
    IFNULL(total_amount / NULLIF(order_count, 0), 0) AS avg_amount&lt;br /&gt;
    FROM user_stats;&lt;br /&gt;
 # order_countが0の場合、0を返す&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== COALESCE関数 ==&lt;br /&gt;
&amp;lt;code&amp;gt;COALESCE&amp;lt;/code&amp;gt; 関数は、引数リストの中で最初の非NULL値を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
全ての引数がNULLの場合、&amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
詳細は [[MySQL - COALESCE関数]] のページを参照すること。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
&amp;lt;code&amp;gt;COALESCE&amp;lt;/code&amp;gt; 関数の基本構文は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 COALESCE(val1, val2, val3, ...)&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 使用例 ====&lt;br /&gt;
&amp;lt;code&amp;gt;COALESCE&amp;lt;/code&amp;gt; 関数を使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 複数のカラムから最初の非NULL値を取得&lt;br /&gt;
 SELECT&lt;br /&gt;
    user_id,&lt;br /&gt;
    COALESCE(mobile_phone, home_phone, office_phone, &amp;#039;連絡先なし&amp;#039;) AS contact&lt;br /&gt;
    FROM users;&lt;br /&gt;
 &lt;br /&gt;
 # フォールバック値のチェーン&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_id,&lt;br /&gt;
    COALESCE(sale_price, regular_price, 0) AS price&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &lt;br /&gt;
 # NULLを含む計算&lt;br /&gt;
 SELECT&lt;br /&gt;
    order_id,&lt;br /&gt;
    price * COALESCE(discount_rate, 1.0) AS final_price&lt;br /&gt;
    FROM orders;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルクエリ ==&lt;br /&gt;
==== SELECT句での使用 ====&lt;br /&gt;
&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; 句でCASE式を使用する時、取得する値を条件に応じて変換できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 価格帯でカテゴリ分け&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    price,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN price &amp;lt; 1000 THEN &amp;#039;economy&amp;#039;&lt;br /&gt;
       WHEN price &amp;gt;= 1000 AND price &amp;lt; 5000 THEN &amp;#039;standard&amp;#039;&lt;br /&gt;
       WHEN price &amp;gt;= 5000 THEN &amp;#039;premium&amp;#039;&lt;br /&gt;
    END AS price_category&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &lt;br /&gt;
 # 複数条件での値変換&lt;br /&gt;
 SELECT&lt;br /&gt;
    order_id,&lt;br /&gt;
    status,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN status = 0 THEN &amp;#039;未処理&amp;#039;&lt;br /&gt;
       WHEN status = 1 AND processed_at IS NULL THEN &amp;#039;処理待ち&amp;#039;&lt;br /&gt;
       WHEN status = 1 AND processed_at IS NOT NULL THEN &amp;#039;処理中&amp;#039;&lt;br /&gt;
       WHEN status = 2 THEN &amp;#039;完了&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;不明&amp;#039;&lt;br /&gt;
    END AS status_name&lt;br /&gt;
    FROM orders;&lt;br /&gt;
 &lt;br /&gt;
 # 計算結果の条件分岐&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    price,&lt;br /&gt;
    stock,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN stock * price &amp;gt; 100000 THEN &amp;#039;高額在庫&amp;#039;&lt;br /&gt;
       WHEN stock * price &amp;gt; 10000 THEN &amp;#039;通常在庫&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;低額在庫&amp;#039;&lt;br /&gt;
    END AS inventory_value&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== WHERE句での使用 (非推奨) ====&lt;br /&gt;
&amp;lt;u&amp;gt;WHERE句でのCASE式の使用は、インデックスを活用できないため推奨されない。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;複数の条件がある場合は、&amp;lt;code&amp;gt;UNION&amp;lt;/code&amp;gt; で分割することを推奨する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # UNIONで分割 (推奨)&lt;br /&gt;
 SELECT * FROM products WHERE category_id = 1 AND price &amp;gt; 1000&lt;br /&gt;
 UNION ALL&lt;br /&gt;
 SELECT * FROM products WHERE category_id = 2 AND price &amp;gt; 2000&lt;br /&gt;
 UNION ALL&lt;br /&gt;
 SELECT * FROM products WHERE category_id NOT IN (1, 2) AND price &amp;gt; 500;&lt;br /&gt;
 &lt;br /&gt;
 # WHERE句でCASE式を使用 (非推奨)&lt;br /&gt;
 SELECT * FROM products&lt;br /&gt;
    WHERE&lt;br /&gt;
       CASE&lt;br /&gt;
          WHEN category_id = 1 THEN price &amp;gt; 1000&lt;br /&gt;
          WHEN category_id = 2 THEN price &amp;gt; 2000&lt;br /&gt;
          ELSE price &amp;gt; 500&lt;br /&gt;
       END;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ORDER BY句での使用 ====&lt;br /&gt;
&amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt; 句でCASE式を使用すると、カスタムソート順を指定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
詳細は [[MySQL - ORDER BY]] のページを参照すること。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # カスタムソート順を指定&lt;br /&gt;
 SELECT * FROM orders&lt;br /&gt;
    ORDER BY&lt;br /&gt;
       CASE region&lt;br /&gt;
          WHEN &amp;#039;Tokyo&amp;#039; THEN 1&lt;br /&gt;
          WHEN &amp;#039;Osaka&amp;#039; THEN 2&lt;br /&gt;
          WHEN &amp;#039;Nagoya&amp;#039; THEN 3&lt;br /&gt;
          ELSE 4&lt;br /&gt;
       END,&lt;br /&gt;
       ordered_at DESC;&lt;br /&gt;
 &lt;br /&gt;
 # 優先度順にソート&lt;br /&gt;
 SELECT * FROM tasks&lt;br /&gt;
    ORDER BY&lt;br /&gt;
       CASE priority&lt;br /&gt;
          WHEN &amp;#039;urgent&amp;#039; THEN 1&lt;br /&gt;
          WHEN &amp;#039;high&amp;#039; THEN 2&lt;br /&gt;
          WHEN &amp;#039;normal&amp;#039; THEN 3&lt;br /&gt;
          WHEN &amp;#039;low&amp;#039; THEN 4&lt;br /&gt;
       END;&lt;br /&gt;
 &lt;br /&gt;
 # NULL値を最後にソート&lt;br /&gt;
 SELECT * FROM employees&lt;br /&gt;
    ORDER BY&lt;br /&gt;
       CASE WHEN manager_id IS NULL THEN 1 ELSE 0 END,&lt;br /&gt;
       manager_id;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== UPDATE文での使用 ====&lt;br /&gt;
&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; 文でCASE式を使用すると、条件に応じて異なる値で更新できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
詳細は [[MySQL - UPDATE]] のページを参照すること。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 条件付き給与調整&lt;br /&gt;
 UPDATE employees&lt;br /&gt;
    SET salary = CASE&lt;br /&gt;
       WHEN performance_score &amp;gt;= 90 THEN salary * 1.1&lt;br /&gt;
       WHEN performance_score &amp;gt;= 70 THEN salary * 1.05&lt;br /&gt;
       ELSE salary&lt;br /&gt;
    END;&lt;br /&gt;
 &lt;br /&gt;
 # 複数カラムの条件付き更新&lt;br /&gt;
 UPDATE products&lt;br /&gt;
    SET&lt;br /&gt;
       status = CASE&lt;br /&gt;
          WHEN stock = 0 THEN &amp;#039;out_of_stock&amp;#039;&lt;br /&gt;
          WHEN stock &amp;lt;= 10 THEN &amp;#039;low_stock&amp;#039;&lt;br /&gt;
          ELSE &amp;#039;in_stock&amp;#039;&lt;br /&gt;
       END,&lt;br /&gt;
       updated_at = NOW();&lt;br /&gt;
 &lt;br /&gt;
 # 特定条件での値変更&lt;br /&gt;
 UPDATE orders&lt;br /&gt;
    SET discount_rate = CASE&lt;br /&gt;
       WHEN total_amount &amp;gt;= 100000 THEN 0.15&lt;br /&gt;
       WHEN total_amount &amp;gt;= 50000 THEN 0.10&lt;br /&gt;
       WHEN total_amount &amp;gt;= 10000 THEN 0.05&lt;br /&gt;
       ELSE 0&lt;br /&gt;
    END;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== GROUP BYとの組み合わせ ====&lt;br /&gt;
&amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; 句とCASE式を組み合わせると、縦横変換やカテゴリ別集計が可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
詳細は [[MySQL - GROUP BY]] のページを参照すること。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 縦横変換 (ピボット)&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_id,&lt;br /&gt;
    SUM(CASE WHEN region = &amp;#039;Tokyo&amp;#039; THEN sales ELSE 0 END) AS tokyo_sales,&lt;br /&gt;
    SUM(CASE WHEN region = &amp;#039;Osaka&amp;#039; THEN sales ELSE 0 END) AS osaka_sales,&lt;br /&gt;
    SUM(CASE WHEN region = &amp;#039;Nagoya&amp;#039; THEN sales ELSE 0 END) AS nagoya_sales&lt;br /&gt;
    FROM sales_data&lt;br /&gt;
    GROUP BY product_id;&lt;br /&gt;
 &lt;br /&gt;
 # カテゴリ別カウント&lt;br /&gt;
 SELECT&lt;br /&gt;
    department_id,&lt;br /&gt;
    COUNT(CASE WHEN salary &amp;gt;= 50000 THEN 1 END) AS high_salary_count,&lt;br /&gt;
    COUNT(CASE WHEN salary &amp;lt; 50000 THEN 1 END) AS low_salary_count&lt;br /&gt;
    FROM employees&lt;br /&gt;
    GROUP BY department_id;&lt;br /&gt;
 &lt;br /&gt;
 # 条件別集計&lt;br /&gt;
 SELECT&lt;br /&gt;
    category_id,&lt;br /&gt;
    SUM(CASE WHEN price &amp;lt; 1000 THEN 1 ELSE 0 END) AS economy_count,&lt;br /&gt;
    SUM(CASE WHEN price &amp;gt;= 1000 AND price &amp;lt; 5000 THEN 1 ELSE 0 END) AS standard_count,&lt;br /&gt;
    SUM(CASE WHEN price &amp;gt;= 5000 THEN 1 ELSE 0 END) AS premium_count&lt;br /&gt;
    FROM products&lt;br /&gt;
    GROUP BY category_id;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ネストしたCASE式 ====&lt;br /&gt;
CASE式はネストできるが可読性が低下するため、3段階以上のネストは避けることを推奨する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 2段階のネスト&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    price,&lt;br /&gt;
    stock,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN stock = 0 THEN &amp;#039;在庫なし&amp;#039;&lt;br /&gt;
       ELSE&lt;br /&gt;
          CASE&lt;br /&gt;
             WHEN price &amp;lt; 1000 THEN &amp;#039;低価格・在庫あり&amp;#039;&lt;br /&gt;
             WHEN price &amp;gt;= 5000 THEN &amp;#039;高価格・在庫あり&amp;#039;&lt;br /&gt;
             ELSE &amp;#039;通常価格・在庫あり&amp;#039;&lt;br /&gt;
          END&lt;br /&gt;
    END AS status&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &lt;br /&gt;
 # 複雑な条件分岐 (3段以上は避ける)&lt;br /&gt;
 SELECT&lt;br /&gt;
    order_id,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN status = &amp;#039;completed&amp;#039; THEN&lt;br /&gt;
          CASE&lt;br /&gt;
             WHEN total_amount &amp;gt;= 10000 THEN &amp;#039;VIP顧客&amp;#039;&lt;br /&gt;
             ELSE &amp;#039;通常顧客&amp;#039;&lt;br /&gt;
          END&lt;br /&gt;
       WHEN status = &amp;#039;pending&amp;#039; THEN &amp;#039;処理待ち&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;不明&amp;#039;&lt;br /&gt;
    END AS customer_type&lt;br /&gt;
    FROM orders;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== パフォーマンスと推奨される事柄 ==&lt;br /&gt;
==== WHERE句でのCASE式 ====&lt;br /&gt;
&amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; 句でCASE式を使用すると、インデックスが活用されない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
複雑な条件がある場合は、&amp;lt;code&amp;gt;UNION&amp;lt;/code&amp;gt; で分割するか、条件を直接記述することを推奨する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # UNIONで分割 (インデックス活用可能)&lt;br /&gt;
 SELECT * FROM products WHERE category_id = 1 AND price &amp;gt; 1000&lt;br /&gt;
 UNION ALL&lt;br /&gt;
 SELECT * FROM products WHERE category_id = 2 AND price &amp;gt; 2000;&lt;br /&gt;
 &lt;br /&gt;
 # インデックスが活用されない例&lt;br /&gt;
 SELECT * FROM products&lt;br /&gt;
    WHERE&lt;br /&gt;
       CASE category_id&lt;br /&gt;
          WHEN 1 THEN price &amp;gt; 1000&lt;br /&gt;
          WHEN 2 THEN price &amp;gt; 2000&lt;br /&gt;
       END;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== SELECT句とUPDATE句での使用 ====&lt;br /&gt;
&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; 句 や &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; 句でのCASE式の使用は、効率的である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # SELECT句での効率的な使用&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN price &amp;lt; 1000 THEN &amp;#039;economy&amp;#039;&lt;br /&gt;
       WHEN price &amp;lt; 5000 THEN &amp;#039;standard&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;premium&amp;#039;&lt;br /&gt;
    END AS price_category&lt;br /&gt;
    FROM products&lt;br /&gt;
    WHERE category_id = 1;&lt;br /&gt;
 &lt;br /&gt;
 # UPDATE句での効率的な使用&lt;br /&gt;
 UPDATE employees&lt;br /&gt;
    SET bonus = CASE&lt;br /&gt;
       WHEN performance_score &amp;gt;= 90 THEN salary * 0.2&lt;br /&gt;
       WHEN performance_score &amp;gt;= 70 THEN salary * 0.1&lt;br /&gt;
       ELSE 0&lt;br /&gt;
    END&lt;br /&gt;
    WHERE department_id = 10;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== WHEN句の順序最適化 ====&lt;br /&gt;
&amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; 句は上から順に評価されるため、マッチ可能性の高い条件を先に配置することで、評価回数を削減できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # マッチ可能性の高い条件を先に配置&lt;br /&gt;
 SELECT&lt;br /&gt;
    product_name,&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN price &amp;lt; 5000 THEN &amp;#039;standard&amp;#039;     # 80%がマッチ&lt;br /&gt;
       WHEN price &amp;gt;= 5000 THEN &amp;#039;premium&amp;#039;     # 15%がマッチ&lt;br /&gt;
       WHEN price &amp;lt; 1000 THEN &amp;#039;economy&amp;#039;      # 5%がマッチ&lt;br /&gt;
    END AS price_category&lt;br /&gt;
    FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 戻り値の型の統一 ====&lt;br /&gt;
&amp;lt;u&amp;gt;CASE式の各 &amp;lt;code&amp;gt;THEN&amp;lt;/code&amp;gt; 句 と &amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; 句の戻り値の型は、統一することを推奨する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
型が異なる場合、MySQLは暗黙的型変換を行うが、パフォーマンスに影響する可能性がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 # 戻り値の型が統一されている (推奨)&lt;br /&gt;
 SELECT&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN status = 0 THEN &amp;#039;未処理&amp;#039;&lt;br /&gt;
       WHEN status = 1 THEN &amp;#039;処理中&amp;#039;&lt;br /&gt;
       ELSE &amp;#039;完了&amp;#039;&lt;br /&gt;
    END AS status_name&lt;br /&gt;
    FROM orders;&lt;br /&gt;
 &lt;br /&gt;
 # 戻り値の型が異なる (非推奨)&lt;br /&gt;
 SELECT&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN status = 0 THEN &amp;#039;未処理&amp;#039;  # 文字列型&lt;br /&gt;
       WHEN status = 1 THEN 1         # 数値型&lt;br /&gt;
       ELSE NULL&lt;br /&gt;
    END AS status_name&lt;br /&gt;
    FROM orders;&lt;br /&gt;
 # MySQLは文字列型に変換するが、パフォーマンスに影響する可能性がある&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連ページ ==&lt;br /&gt;
* [[MySQL - SELECT]]&lt;br /&gt;
* [[MySQL - UPDATE]]&lt;br /&gt;
* [[MySQL - COALESCE関数]]&lt;br /&gt;
* [[MySQL - GROUP BY]]&lt;br /&gt;
* [[MySQL - ORDER BY]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板&lt;br /&gt;
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:MySQL]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>