小さい会社の1人SEの開発記というか奮戦記

  1. SQL Server
  2. 2183 view

CASE文でビューに分岐処理を実装する【SQL Server】

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式」を使う必要がありますので覚えておくとかなり役立ちます

読替であれば読替テーブルを作成した方がメンテナンス性に優れていることを付記しておきます。

SQL Serverの最近記事

  1. SQL文で今日から7日前までを指定する

  2. CASE文でビューに分岐処理を実装する【SQL Server】

  3. 変更の保存が許可されていません【SQL Server】

  4. Select Into でテーブルを別のマシンにコピーする【SQL Server】

  5. IN句+サブクエリを使ってデーターを削除する【SQL Server】

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


お薦め書籍

最近の記事

  1. Access

    Accessの数値型ではまる・・・。
  2. Excel

    日本語をエンコードする【Excel VBA】
  3. Access

    クエリで日付から曜日を算出する。【Access】
  4. PCパーツ

    ASUS AMD Ryzen 4000 シリーズ搭載小型ベア…
  5. Microsoft365

    コンデジをTeamsのWebカメラに使う
  6. SQL Server

    SQL文で今日から7日前までを指定する