SQLでコードを日本語に読み替えるには読み替えテーブルを作成するのが一般的ですが、処理時間はクライアント側のPC能力に左右されてしまいます。サーバー側で処理してしまった方が時間的に短縮できると判断した場合は積極的にサーバー側で処理しましょう。今回はSQLの分岐処理についてまとめます。
SQLでの分岐処理
SQLで分岐処理を組むにはCASE式を使います。(参考:Microsoft Docs)
単純CASE式
CASE input_expression
WHEN when_expression THEN result_expression [ …n ]
[ ELSE else_result_expression ]
END
検索CASE式
CASE
WHEN Boolean_expression THEN result_expression [ …n ]
[ ELSE else_result_expression ]
END
引数
- input_expression
単純 CASE 形式を使用した場合に評価される式です。 input_expression は任意の有効な式です。- WHEN when_expression
単純 CASE 形式を使用した場合に input_expression と比較される単純式です。 when_expression は任意の有効な式です。 input_expression と各 when_expression のデータ型は同一であるか、暗黙的な変換によって同一の型になる必要があります。- THEN result_expression
input_expression = when_expression が TRUE に評価されるとき、または Boolean_expression が TRUE に評価されるときに返される式です。 result_expression は任意の有効な式です。- ELSE else_result_expression
比較操作の評価がいずれも TRUE でなかった場合に返される式です。 この引数を省略し、比較操作のいずれも TRUE でなかった場合、CASE は NULL を返します。 else_result_expression は任意の有効な式です。else_result_expression とすべての result_expression のデータ型は同一であるか、暗黙的な変換によって同一の型になる必要があります。- WHEN Boolean_expression
検索 CASE 形式で評価するブール式です。 Boolean_expression は任意の有効なブール式です。
使用例
単純CASE式で読み替える。検索CASE式でステータスを表示する。が良くある使い方だと思いますのでその例を以下にまとめます
単純CASE式
CASE の後ろに列名をいれ、WHEN の後ろに列の値を入力して処理を分岐します。
- 以下のルールで読み替えます
Null → ‘本社’
‘A’ → ‘A事業場’
‘B’ → ‘B工場’
‘C’ → ‘C工場’
その他 → ‘本社’ - 列名は読替元を「サイトコード」、読替後を「サイト名」とするとCASE式は以下となります
CASE サイトコード
WHEN IS NULL THEN ‘本社’
WHEN ‘A’ THEN ‘A事業場’
WHEN ‘B’ THEN ‘B工場’
WHEN ‘C’ THEN ‘C工場’
ELSE ‘本社’ END
AS サイト名 - T_TESTというテーブルにサイトコードという列名があった場合、サイトコードとサイト名をSELECTするSQL文は、直線で見づらいですがSSMSでは以下となります。
SELECT サイトコード, CASE サイトコード WHEN IS NULL THEN ‘本社’ WHEN ‘A’ THEN ‘A事業場’ WHEN ‘B’ THEN ‘B工場’ WHEN ‘C’ THEN ‘C工場’ ELSE ‘本社’ END AS サイト名 FROM T_TEST
検索CASE式
WHENの後ろに列名と値を入力し、その成否で処理を分岐します。
- T_TESTと言うテーブルを以下で作成します。それぞれの対応時間が getdate() で入力され、未対応のものには Null が入っているものとします。
列名 | データ型式 | 備考 |
---|---|---|
作番 | nvarchar(30) | 主キー, Not Null |
出庫開始日 | datetime | |
出庫完了日 | datetime | |
製造開始日 | datetime | |
製造完了日 | datetime | |
検査開始日 | datetime | |
検査完了日 | datetime | |
出荷日 | datetime |
- どこに日付が入っているかでステータスの値を変更していきます。後ろ工程に日付が入っているものを優先にステータスを組んで行きます。
出荷完 → 検査完 → 検査中 → 製造完 → 製造中 → 出庫完 → 出庫中 → Null とするとステータスのSQL文は以下となります。
CASE
WHEN 出荷日 IS NOT NULL THEN ‘出荷完’
WHEN 検査完了日 IS NOT NULL THEN ‘検査完’
WHEN 検査開始日 IS NOT NULL THEN ‘検査中’
WHEN 製造完了日 IS NOT NULL THEN ‘製造完’
WHEN 製造開始日 IS NOT NULL THEN ‘製造中’
WHEN 出庫完了日 IS NOT NULL THEN ‘出庫完’
WHEN 出庫開始日 IS NOT NULL THEN ‘出庫中’
ELSE NULL END AS ステータス - T_TEST の後ろにステータスを付ける場合のビューは以下となります。
SELECT *, CASE
WHEN 出荷日 IS NOT NULL THEN ‘出荷完’
WHEN 検査完了日 IS NOT NULL THEN ‘検査完’
WHEN 検査開始日 IS NOT NULL THEN ‘検査中’
WHEN 製造完了日 IS NOT NULL THEN ‘製造完’
WHEN 製造開始日 IS NOT NULL THEN ‘製造中’
WHEN 出庫完了日 IS NOT NULL THEN ‘出庫完’
WHEN 出庫開始日 IS NOT NULL THEN ‘出庫中’
ELSE NULL END AS ステータス
FROM T_TEST (WHERE 検索条件…etc.)
まとめ
ステータスなど状況の変化によって値が変わるものは「検索CASE式」を使う必要がありますので覚えておくとかなり役立ちます
読替であれば読替テーブルを作成した方がメンテナンス性に優れていることを付記しておきます。
この記事へのコメントはありません。