CASE
WHEN 條件1
THEN 結果1
WHEN 條件2
THEN 結果2
WHEN 條件3
THEN 結果3
WHEN 條件4
THEN 結果4
.........
WHEN 條件N
THEN 結果N
ELSE
結果X
END
Case具有兩種格式。簡單Case函數和Case搜尋函數。
--簡單Case函數
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜尋函數
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
例如:
SELECT
id, name, cj, (CASE WHEN cj < 60 THEN '不及格' WHEN cj
BETWEEN 60 AND 90 THEN '良好' WHEN cj > 90 THEN '優秀'
END) AS 狀态
FROM stud
這兩種方式,可以實作相同的功能。簡單Case函數的寫法相對比較簡潔,但是和Case搜尋函數相比,功能方面會有些限制,比如寫判斷式。
還有一個需要注意的問題,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
想要解決這個問題,你會怎麼做?生成一個帶有洲Code的View,是一個解決方法,但是這樣很難動态的改變統計的方式。
如果使用Case函數,SQL代碼如下:
SELECT SUM(population),
CASE
country
WHEN
'中國'
THEN '亞洲'
'印度'
'日本'
'美國'
THEN '北美洲'
'加拿大' THEN '北美洲'
'墨西哥' THEN '北美洲'
ELSE
'其他' END
FROM Table_A
GROUP BY CASE country
'其他' END;
同樣的,我們也可以用這個方法來判斷工資的等級,并統計每一等級的人數。SQL代碼如下;
SELECT
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'
NULL END salary_class,
COUNT(*)
GROUP BY
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也可以實作用一條語句進行查詢。但是那樣增加消耗(兩個Select部分),而且SQL語句會比較長。
下面是一個是用Case函數來完成這個功能的例子
SELECT country,
SUM( CASE WHEN sex = '1' THEN
population
ELSE 0 END), --男性人口
SUM( CASE WHEN sex = '2' THEN
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,如下所示
( sex = '2' AND salary > 1000 )
女職員的條件倒是符合了,男職員就無法輸入了。
Select top 100 State,JoinState,

(case when State=1 and Joinstate=0 then 2 when State=1 and JoinState=1 then 1 else 0 end) as usestate from UserInfo
(2)
select
ID,Username,namer=(case
when(score<='50')
then '實習'
when(score>'50'
and score<='500'
) then
'赤腳醫生'
when(score>'500' and
score<='1000' )
then '村衛生員'
when(score>'1000' and
score<='1500' )
then '鄉衛生員'
when(score>'1500' and
score<='2000' )
then '鎮衛生員'
when(score>'2000' and
score<='3000' )
then '醫師'
when(score>'3000' and
score<='5000' )
then '主治醫師'
when(score>'5000' and
score<='10000' )
then '副主任醫師'
when(score>'10000' and
score<='20000' )
then '主任醫師'
when(score>'20000' and
score<='50000' )
then '健康大使'
else '健康大使'
end ), (SELECT count(id)
FROM jk01_YiWen_Question
WHERE UserID =
dbo.jk01_Member.ID) as
questionnum
from jk01_Member