CASE WHENを使ってSQLでIF文を使わずに条件を分岐する

プログラミング SQL Server

SQLでIFを書けばWHERE句の内容を変えて検索できますが、条件ごとに同じようなSQLを複数回書くのは面倒なので、1行で分岐できないかと言う事でSQLを作って見ました。

スポンサーリンク

SQLでIFを使わずに条件分岐する

方法はWHERE句の条件にCASE WHENを使用して、条件分岐を行います。

1.テーブルとデータの準備

まずはテーブルとその検索用データを以下のSQLで作成します。
<<テーブル>>

    CREATE TABLE 社員マスタ
    (
       社員番号  INT
      ,氏名      VARCHAR(20)
      ,部署      VARCHAR(20)
    )

<<検索用データ>>

INSERT INTO 社員マスタ VALUES (1, '太郎さん', '営業部' )
INSERT INTO 社員マスタ VALUES (2, '次郎さん', '経理部' )
INSERT INTO 社員マスタ VALUES (3, '三郎さん', '人事部' )
INSERT INTO 社員マスタ VALUES (4, '四郎さん', '営業部' )
INSERT INTO 社員マスタ VALUES (5, '五郎さん', '経理部' )
INSERT INTO 社員マスタ VALUES (6, '六郎さん', '人事部' )
INSERT INTO 社員マスタ VALUES (7, '七郎さん', '営業部' )
INSERT INTO 社員マスタ VALUES (8, '八郎さん', '経理部' )
INSERT INTO 社員マスタ VALUES (9, '九郎さん', '人事部' ) 

2.条件を分岐させて検索

今回は「社員番号」を指定せずに全件取得する場合と「社員番号」を指定して1件のみに絞り込んだものを1行のSQLで実行します。

まずは全件検索。

    DECLARE @検索社員番号 int = NULL
    SELECT
        *
    FROM
        社員マスタ
    WHERE
        社員番号 = CASE WHEN @検索社員番号 IS NULL THEN  社員番号 ELSE @検索社員番号 END

動作結果。

社員番号 氏名 部署
1 太郎さん 営業部
2 次郎さん 経理部
3 三郎さん 人事部
4 四郎さん 営業部
5 五郎さん 経理部
6 六郎さん 人事部
7 七郎さん 営業部
8 八郎さん 経理部
9 九郎さん 人事部

無事全件検索できました。

次に「社員番号」が「5」の人(1件に絞り込み)を取得します。

    DECLARE @検索社員番号 int = 5
    SELECT
        *
    FROM
        社員マスタ
    WHERE
        社員番号 = CASE WHEN @検索社員番号 IS NULL THEN  社員番号 ELSE @検索社員番号 END

実行結果。

社員番号 氏名 部署
5 五郎さん 経理部

指定した「五郎さん」だけが取得できました。

3.解説

    WHERE
        社員番号 = CASE WHEN @検索社員番号 IS NULL THEN  社員番号 ELSE @検索社員番号 END

でCASE WHEを使用することで「条件が指定されてない(@検索社員番号がNULL)」の場合はテーブルの値をそのまま使用し、「条件が指定された(@検索社員番号がNULL以外)の場合はその指定された値で検索します。

これでIF文を書くことなく、条件を分岐させることができるようになります。

SQLを書く量を少なくすることができます。

タイトルとURLをコピーしました