【SQL Server】CASE 使い方
CASE 式とは
CASE 式 は WHEN で条件を指定して上から順番にチェックしていき、最初に TRUE となる条件の結果を返します。
どの条件とも合致しない場合、
- ELSE が指定されている場合は ELSE の結果を返します。
- 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
 
  
  
  
  
コメント