MSSQL Case whenの使い方
Caseには2つのフォーマットがあります.単純Case関数とCase探索関数.
この2つの方式は、同じ機能を実現することができる.単純なCase関数の書き方は比較的簡潔であるが,Case探索関数と比較して機能面に制約があり,例えば判断式を書く.
もう1つ注意しなければならない問題は、Case関数が最初の条件に合致する値だけを返し、残りのCase部分は自動的に無視されます.
次に、Case関数を使って何ができるかを見てみましょう.
一、既知のデータは別の方法でグループ化し、分析する.
(もっとはっきり見えるように国コードではなく国名をそのままPrimary Keyとして使っています)
国(country)
人口(population)
中国
600
アメリカ
100
カナダ
100
イギリス
200
フランス
300
日本
250
ドイツ
200
メキシコ
50
インド
250
この国の人口データに基づいて、アジアと北アメリカの人口を統計します.次の結果が得られるはずです.
洲
人口
アジア
1100
北アメリカ
250
その他
700
この問題を解決するには、どうしますか.大陸コードを持つViewを生成することは解決策であるが,統計を動的に変えることは難しい.
Case関数を使用する場合、SQLコードは次のとおりです.
同様に、この方法で給料の等級を判断し、各等級の人数を統計することもできます.SQLコードは以下の通りです.
二、一つの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を用いて二次元テーブルの出力形式を完成させ,Case関数の強さを十分に示した.
三,CheckでCase関数を使用する.
CheckでCase関数を用いることは多くの場合非常によい解決法である.Checkを全く使わない人も多いかもしれませんが、次の例を見てからSQLでCheckを使ってみることをお勧めします.
例を挙げてみましょう
会社A、この会社には女性社員の給料が1000元以上でなければならない規定があります.CheckとCaseで表現すると、次のようになります
Checkを単純に使うと、以下のようになります
女性社員の条件は合っているが、男性社員は入力できない.
-- 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 )
女性社員の条件は合っているが、男性社員は入力できない.