case具有兩種格式。簡單case函式和case搜尋函式。--簡單case函式
case ***
when '1
' then '男'
when '2
' then '女'
else '其他
'end
--case搜尋函式
case when *** = '
1' then '男'
when *** = '
2' then '女'
else '其他
'end
這兩種方式,可以實現相同的功能。簡單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 '亞洲'
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) 性別(***) 人口(population)
中國 1
340中國
2260
美國 1
45美國 255
加拿大 151
加拿大 249
英國 1
40英國 260
按照國家和性別進行分組,得出結果如下
國家 男 女
中國 340
260美國
4555
加拿大
5149
英國 40
60普通情況下,用union也可以實現用一條語句進行查詢。但是那樣增加消耗(兩個select部分),而且sql語句會比較長。
下面是乙個是用case函式來完成這個功能的例子
select country,
sum( case when *** = '1'
then
population else
0 end), --男性人口
sum( case when *** = '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 *** = '2'
then case when salary > 1000
then
1 else 0
endelse
1 end = 1
)如果單純使用check,如下所示
constraint check_salary check
( *** = '
2' and salary > 1000
)女職員的條件倒是符合了,男職員就無法輸入了
接上:empname empcode kind days
艾立華
714204 事假 9
李鍇 714271 加班 2
於常青
714279 加班 4
呂丹 714207 產假 182
李瑩 714269 病假 6
白璐 721338 病假 2
白璐 721338 加班 368
變成empname empcode kind days 加班
艾立華
714204 事假 9
0李鍇
714271 事假 0
2於常青
714279 事假 0
4呂丹
714207 產假 182
0李瑩
714269 病假 6
0白璐
721338 病假 2
0白璐
721338 事假 0
368select
empname ,empcode,
case when kind='
加班' then '事假'
else
kind
end
'kind',
case when kind!='
加班' then days else
0end
'days',
case when kind!='
加班' then 0
else
days
end '加班
'from t
select語句中更改查詢結果 case when
有時資料庫中為了儲存空間的節約,存了一些比較小的字段,這是可以在select語句中進行轉換。在 select 語句中用條件語句 如果,資料庫中乙個字段 gender 來儲存性別,存的是 1 0兩個值,這時可以用 select case when gender 1 then man else woma...
sqlserver 中Cube,rollup的使用
一 select from cj 1張三語文80.0 2張三數學90.0 3張三物理85.0 4李四語文85.0 5李四數學92.0 6李四物理82.0 二 select name,sum result from cj group by name 李四259.0 張三255.0 三 select n...
sql server 中語法校驗
在今天的培訓考試過程中,我提出乙個擴充套件題,要求對提交的sql進行語法校驗.其實這個題很簡單,根本不需要用正規表示式去做語法分析,可以直接使用sql server自帶的功能.不多說,上 alter proc sp checksql sql varchar 8000 error varchar ma...