第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