SQLServer 中Case When的用法

2021-09-06 05:47:06 字數 4348 閱讀 6263

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...