この記事を読むのに必要な時間は約 7 分です。
条件分岐
CASE式を利用してあれこれ結果を書き換える
selectした結果について出力内容を変更したいことがあると思います。例えば
- 50点以上は[合格]、49点以下は[不合格]
- 性別がMなら[男の子]、性別がFなら[女の子]
- 年齢が19以下なら[未成年]、20以上なら[成人]
これら以外にもメールアドレスに特定の文字列が入っていたら、アルバイトか正社員かなど場合分けしたい場合があると思います。
このようなときに役立つのがCASE式です。
それでは実際に見てみましょう。
今回は、

でダウンロードした[AdventureWorks]で試してみたいと思います。
まずは、DB内のテーブル[DimCustomer]を開いて以下の状態にまでもっていきます。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/
SELECT
[FirstName]
,[MiddleName]
,[LastName]
,[Gender]
FROM [AdventureWorksDW2016_EXT].[dbo].[DimCustomer]
今回はこの例で[Gender]を使ってCASE式を書き換えてみましょう。

いきなりかきかえない!コピーを先にする。
データについて、[Gender]にいきなりCASE式を当てはめてはいけません。理由は簡単です。ぱっと見
わかりにくくなります。
消すのは最後にできますから、まずは[Gender]を複製して二列表示させるようにしましょう。
この様な感じですね。

実際にCASE式を書いてみる。
それでは書いてみます。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/
SELECT
[FirstName]
,[MiddleName]
,[LastName]
,[Gender]
,(case when [Gender]='M' then 'Male'
when [Gender]='F' then 'Female' end)
FROM [AdventureWorksDW2016_EXT].[dbo].[DimCustomer]
この通り、CASE式を使って出力結果を書き換える事ができました。

元の[Gender]が残っているため、出力結果が正しいのか否か、一目瞭然です。
CASE式でNULLを消す
次に、画面上に出ているミドルネームの場所で、NULLが入っている部分を消したいと思います。仕事で利用する場合、このNULLをプログラムで処理するかSQL側で処理するか分かれると思います。
例えば、C#等でSQLから取得した値を変換するとCPUに負荷をかけてしまいますので、この程度の変換はSQLで行うようにしましょう。
それでは書いてい見ます。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/
SELECT
[FirstName]
,[MiddleName]
,(case when [MiddleName] is null then '-'
when [MiddleName] is not null then [MiddleName] end)
,[LastName]
,[Gender]
,(case when [Gender]='M' then 'Male'
when [Gender]='F' then 'Female' end)
FROM [AdventureWorksDW2016_EXT].[dbo].[DimCustomer]
この様な形で、NULLが入っていた場所は ‘-‘ に置き換えてみました。また、 is not null に該当する場所は無理して何かに置き換えるのではなく、元の値をそのまま表示させています。

また、CASE式で条件に当てはまらなかった場合は初期値として何かを指定する事もできます。それが、 else です。データの特性を理解していれば、そこに何らかの値が入ることを理解できていると思いますが、予期せぬトラブルがでないとも限りませんので else は必ず入れるようにしましょう。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/
SELECT
[FirstName]
,[MiddleName]
,(case when [MiddleName] is null then '-'
else [MiddleName] end)
,[LastName]
,[Gender]
,(case when [Gender]='M' then 'Male'
when [Gender]='F' then 'Female' end)
FROM [AdventureWorksDW2016_EXT].[dbo].[DimCustomer]
例の場合、ミドルネームが NULL でない場合は、もともとあった値をそのまま出力するように書き換えました。

それでは不要な場所を削って若干成型してみます。

CASE式は入れ子にも対応していますので、ある程度条件が複雑であっても対応する事は可能です。
本日はここまで!


