ホーム > 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 式と共に使用した場合、

  • 比較元は一つだけ。
  • 比較対象は複数比較できます。

[code=”sql”]
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;
[/code]

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

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

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

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

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

[code=”sql”]
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; [/code]

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

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

[code=”sql”]
SELECT 生徒_id, 生徒_name,
IIf(IsNull(生徒_access), ‘徒歩通学’, 生徒_access) AS [access]
FROM 生徒;
[/code]

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

[code=”sql”]
SELECT 生徒_id, 生徒_name, access =
CASE
WHEN 生徒_access IS NULL THEN ‘徒歩通学’
ELSE 生徒_access
END
FROM 生徒;
[/code]

ORDER BY 句で CASE を使用する

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

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

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

[code=”sql”]
SELECT 生徒_id, 生徒_name
FROM 生徒;
ORDER BY
CASE 生徒_country
WHEN ‘Japan’ THEN 生徒_address
ELSE 生徒_country
END
[/code]

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

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

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

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

[code=”sql”]
UPDATE 生徒
SET 生徒_評価=
( CASE
WHEN (生徒_平均点 < 50) THEN 'D' WHEN (生徒_平均点 < 70) THEN 'C' WHEN (生徒_平均点 < 85) THEN 'B' ELSE 'A' END ) [/code]

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

HAVING 句で CASE を使用する

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

[code=”sql”]
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
[/code]

関連するエントリー

SQL Server, データベース ,

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