第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;
[/code]
<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
)
[/code]
<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
