SQL Caseの使い方

15435 ワード

Caseは二種類のフォーマットを持っている。簡単な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検索関数と比較して、機能の面では判定式を書くなど制限があります。 
もう一つの注意すべき問題があります。Case関数は最初の該当条件の値だけを返します。残りのCase部分は自動的に無視されます。 
--   ,    SQL,       “   ”    
CASE WHEN col_1 IN ( 'a', 'b') THEN '   '
WHEN col_1 IN ('a')       THEN '   '
ELSE'  ' END
次に、Case関数を使って、どんなことができますか? 
一つは、既知のデータを別の方法でグループ化し、分析することである。
 
次のようなデータがあります。 
国家(country)
人口(population)
中国
600
米国
100
カナダ
100
イギリス
200
フランス
300
日本
250
ドイツ
200
メキシコ
50
インド
250
この国の人口データに基づいて、アジアと北アメリカ大陸の人口を統計します。次のような結果を得るべきです。 

人口
アジア
1100
北アメリカ大陸
250
その他
700
この問題を解決したいですが、どうしますか?州のCodeを持つ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でも一つの文で照会することができます。しかし、そのように消費が増加し、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 )
女子社員の条件は合っていますが、男性社員は入力できません。