MSSQL Case whenの使い方


Caseには2つのフォーマットがあります.単純Case関数とCase探索関数.
--  Case  
CASE sex
WHEN '1' THEN ' '
WHEN '2' THEN ' '
ELSE '  ' END
--Case    
CASE WHEN sex = '1' THEN ' '
WHEN sex = '2' THEN ' '
ELSE '  ' END

この2つの方式は、同じ機能を実現することができる.単純なCase関数の書き方は比較的簡潔であるが,Case探索関数と比較して機能面に制約があり,例えば判断式を書く.
もう1つ注意しなければならない問題は、Case関数が最初の条件に合致する値だけを返し、残りのCase部分は自動的に無視されます.
--   ,    SQL,       “   ”    
CASE WHEN col_1 IN ( 'a', 'b') THEN '   '
WHEN col_1 IN ('a')       THEN '   '
ELSE'  ' END

次に、Case関数を使って何ができるかを見てみましょう.
一、既知のデータは別の方法でグループ化し、分析する.
(もっとはっきり見えるように国コードではなく国名をそのままPrimary Keyとして使っています)
国(country)
人口(population)
中国
600
アメリカ
100
カナダ
100
イギリス
200
フランス
300
日本
250
ドイツ
200
メキシコ
50
インド
250
この国の人口データに基づいて、アジアと北アメリカの人口を統計します.次の結果が得られるはずです.

人口
アジア
1100
北アメリカ
250
その他
700
この問題を解決するには、どうしますか.大陸コードを持つViewを生成することは解決策であるが,統計を動的に変えることは難しい.
Case関数を使用する場合、SQLコードは次のとおりです.
SELECT  SUM(population),
CASE country
WHEN '  '     THEN '  '
WHEN '  '     THEN '  '
WHEN '  '     THEN '  '
WHEN '  '     THEN '   '
WHEN '   '  THEN '   '
WHEN '   '  THEN '   '
ELSE '  ' END
FROM    Table_A
GROUP BY CASE country
WHEN '  '     THEN '  '
WHEN '  '     THEN '  '
WHEN '  '     THEN '  '
WHEN '  '     THEN '   '
WHEN '   '  THEN '   '
WHEN '   '  THEN '   '
ELSE '  ' END;

同様に、この方法で給料の等級を判断し、各等級の人数を統計することもできます.SQLコードは以下の通りです.
SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600  THEN '2'
WHEN salary > 600 AND salary <= 800  THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class,
COUNT(*)
FROM    Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600  THEN '2'
WHEN salary > 600 AND salary <= 800  THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;

二、一つのSQL文で異なる条件のグループを完成する.
次のデータがあります.
国(country)
性別(sex)
人口(population)
中国
1
340
中国
2
260
アメリカ
1
45
アメリカ
2
55
カナダ
1
51
カナダ
2
49
イギリス
1
40
イギリス
2
60
国と性別別にグループ化した結果、以下のようになった.



中国
340
260
アメリカ
45
55
カナダ
51
49
イギリス
40
60
通常、UNIONでは1つの文でクエリを行うこともできます.しかし、そのように消費量が増加し(2つのSelect部分)、SQL文が長くなります.
次はCase関数でこの機能を完成させる例です
SELECT country,
SUM( CASE WHEN sex = '1' THEN
population ELSE 0 END),  --    
SUM( CASE WHEN sex = '2' THEN
population ELSE 0 END)   --    
FROM  Table_A
GROUP BY country;

このようにSelectを用いて二次元テーブルの出力形式を完成させ,Case関数の強さを十分に示した.
三,CheckでCase関数を使用する.
CheckでCase関数を用いることは多くの場合非常によい解決法である.Checkを全く使わない人も多いかもしれませんが、次の例を見てからSQLでCheckを使ってみることをお勧めします.
例を挙げてみましょう
会社A、この会社には女性社員の給料が1000元以上でなければならない規定があります.CheckとCaseで表現すると、次のようになります
CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN salary > 1000
THEN 1 ELSE 0 END
ELSE 1 END = 1 )

Checkを単純に使うと、以下のようになります
CONSTRAINT check_salary CHECK
( sex = '2' AND salary > 1000 )

女性社員の条件は合っているが、男性社員は入力できない.