【SQL Server】CASE 使い方

SQL Server
この記事は約4分で読めます。

【SQL Server】CASE 使い方

CASE 式とは

CASE 式 は WHEN で条件を指定して上から順番にチェックしていき、最初に TRUE となる条件の結果を返します。

どの条件とも合致しない場合、

  1. ELSE が指定されている場合は ELSE の結果を返します。
  2. ELSE が指定されていない場合は NULL を返します

書き方

書き方は単純CASE 式と検索CASE 式の2通りの書き方があります。

今から覚えるって人は、まず、検索CASE式を覚えましょう。

理由は単純に条件式が書きやすくて、読みやすいからです。

単純CASE式だと下記の例のように単純な条件であれば、良いのですが、複数の条件を書くと途端に読みにくくなります。

あと、経験上ですが、検索CASE式で書いてあるクエリの方が多い気がします。

実行例

--テーブルの準備
CREATE TABLE 食べ物
(
     Id     int identity(1, 1)
    ,名前   varchar(20)
    ,種類   varchar(20)
);
  
--データの準備
INSERT INTO 食べ物 VALUES
('りんご', '果物' ), 
('みかん', '' ),
('ピーマン', '野菜' ),
('パン', NULL )

SELECT 
    *,
    -----------------------
    -- 単純 CASE 式
    CASE 種類
         WHEN '果物' THEN '美味しい' 
         WHEN '野菜' THEN 'まずい' 
         ELSE 'その他'
    END AS 単純CASE式,
    -----------------------
    -- 検索 CASE 式
    CASE WHEN 種類 = '果物' THEN '美味しい' 
         WHEN 種類 = '野菜' THEN 'まずい' 
         ELSE 'その他'
    END AS 検索CASE式
FROM 食べ物

DROP TABLE 食べ物
Id 名前 種類 単純CASE式 検索CASE式
1 りんご 果物 美味しい 美味しい
2 みかん その他 その他
3 ピーマン 野菜 まずい まずい
4 パン NULL その他 その他

CASE式のネスト

CASE式はネストしてさらに条件分岐させることが、可能ですが、最大ネスト数があって10階層まで可能です。それ以上ネストするとエラーになります。
これは、エラーになる例です。10までで止めておくとエラーになりません。

SELECT 
     CASE WHEN 1 = 1 THEN  
          CASE WHEN 2 = 2 THEN  
               CASE WHEN 3 = 3 THEN  
                    CASE WHEN 4 = 4 THEN  
                         CASE WHEN 5 = 5 THEN  
                              CASE WHEN 6 = 6 THEN  
                                   CASE WHEN 7 = 7 THEN  
                                        CASE WHEN 8 = 8 THEN  
                                             CASE WHEN 9 = 9 THEN  
                                                  CASE WHEN 10 = 10 THEN 
                                                      CASE WHEN 11 = 11 THEN  11
                                                      END
                                                  END
                                             END
                                        END
                                   END
                              END
                         END
                    END
               END
          END
      END

 

コメント

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