ホーム > SQL Server, データベース > 第3回 SQL Server Select文で条件分岐case文-使用例編

第3回 SQL Server Select文で条件分岐case文-使用例編

2009 年 3 月 30 日

第3回 SQL Server Select文で条件分岐case文

photo by inesbexiga

前回、第2回 SQL Server Select文で 条件分岐 case文の使用では、case文の種類をエントリーしました。

case文には、2種類、単純case式と検索case式がありました。

今回は、実際にcase文の使用例をあげたいと思います。

SELECT ステートメントを単純 CASE 式と共に使用する

下記の例では、スナックテーブルのsnack_kind_idからスナック種類を特定して、snack_categoryに代入しています。

SELECT ステートメントを単純 CASE 式と共に使用した場合、

  • 比較元は一つだけ。
  • 比較対象は複数比較できます。
SELECT   snack_id, snack_category=
      CASE snack_kind_id
         WHEN 'a' THEN 'あめちゃん'
         WHEN 'c' THEN 'チョコレート'
         WHEN 'e' THEN 'えびせん'
         WHEN 'o' THEN 'おかき'
         ELSE 'お店には置いていません'
      END,
   snack_name
FROM snack
ORDER BY snack_order;

SELECT ステートメントを検索 CASE 式と共に使用する

下記の例では、スナックテーブル(snack)のsnack_price からお菓子の値段を参照して、price_rangeにお菓子の価格帯を代入しています。

  • 複数の比較元を使用できます。
  • 結果セット内で値を置換できます
  • 注意しなければいけないのは、WHEN句で比較に成功した場合、その下へ処理は流れず、CASE文を抜けます。よって、結果の上書きはできません。

SELECT ステートメント内では、検索 CASE 式は比較値に基づいて結果セット内で値を置換できます。

次の例では、表示価格を、製品の価格範囲に基づいたテキスト コメントとして表示しています。

SELECT   snack_id, snack_name, price_range = 
      CASE 
         WHEN snack_price < 0 THEN '値段がついていない商品'
         WHEN snack_price < 100 THEN '100円未満の商品'
         WHEN snack_price >= 100 and snack_price < 300 THEN '50円以上、300円未満'
         WHEN snack_price >= 300 and snack_price < 1000 THEN '300円~1000円未満'
         ELSE '1000円以上'
      END
FROM snack
ORDER BY snack_order;
&#91;/code&#93;

<h4>Microsoft Access で使用される IIf 関数を CASE で置き換える</h4>

下記のAccessで使用されるIIF関数では、”生徒_access”に値が入っていない場合は、”徒歩通学”としそれ以外の値が入っている場合は、”生徒_access”の値である通学方法を”access”に代入しています。


SELECT 生徒_id, 生徒_name, 
     IIf(IsNull(生徒_access), '徒歩通学', 生徒_access) AS [access]
FROM 生徒; 

これを、case文を使用して、書き換えると

SELECT 生徒_id, 生徒_name, access =
     CASE
         WHEN 生徒_access IS NULL THEN '徒歩通学'
         ELSE 生徒_access
     END
FROM 生徒;

ORDER BY 句で CASE を使用する

ORDER BY句以下で、並べ替え対象を指示します。

生徒_countryが‘Japan’の場合は、生徒_addressで住所で並べ替え
生徒_countryがそれ以外の場合は、生徒_countryで国別で並べ替え
と、指示できます。

これって、便利だと思います。

SELECT 生徒_id, 生徒_name 
FROM 生徒;
ORDER BY
     CASE 生徒_country
         WHEN 'Japan' THEN 生徒_address
         ELSE 生徒_country
     END

UPDATE ステートメントで CASE を使用する

生徒テーブル、生徒_平均点が

  • 50点以下なら”D”評価
  • 70点以下なら”C”評価
  • 85点以下なら”B”評価
  • それ以外85点以上の場合は、”A”評価

を生徒_評価に代入します。

UPDATE 生徒
SET 生徒_評価= 
    ( CASE
         WHEN (生徒_平均点  < 50) THEN 'D'
         WHEN (生徒_平均点  < 70) THEN 'C'
         WHEN (生徒_平均点  < 85) THEN 'B'
         ELSE 'A'
       END
    )
&#91;/code&#93;

<h4>SET ステートメントで CASE を使用する</h4>

<h4> HAVING 句で CASE を使用する</h4>
クラス別に、評価がもう少しで上がりそうな生徒の最高平均点を抽出するHAVING句です。


SELECT 生徒_id, 生徒_name, MAX(生徒_平均点) AS MAX_平均点
FROM 生徒
GROUP BY 生徒_クラス
HAVING
         (MAX(
         CASE 
                  WHEN 生徒_評価 = ‘D’ THEN 生徒_平均点
                  ELSE NULL
         END
         ) >= 45
         (MAX(
         CASE 
                  WHEN 生徒_評価 = ‘C’ THEN 生徒_平均点
                  ELSE NULL
         END
         ) >= 65
         OR
         (MAX(
         CASE 
                  WHEN 生徒_評価 = ‘B’ THEN 生徒_平均点
                  ELSE NULL
         END
         ) >= 80

関連するエントリー

    None Found

SQL Server, データベース ,

  1. コメントはまだありません。
  1. トラックバックはまだありません。