oracle case when的使用方法
來(lái)源:易賢網(wǎng) 閱讀:1346 次 日期:2014-09-17 10:56:33
溫馨提示:易賢網(wǎng)小編為您整理了“oracle case when的使用方法”,方便廣大網(wǎng)友查閱!

Case when 的用法,簡(jiǎn)單Case函數(shù)

簡(jiǎn)單CASE表達(dá)式,使用表達(dá)式確定返回值.

語(yǔ)法:

CASE search_expression

WHEN expression1 THEN result1

WHEN expression2 THEN result2

...

WHEN expressionN THEN resultN

ELSE default_result

搜索CASE表達(dá)式,使用條件確定返回值.

語(yǔ)法:

CASE

WHEN condition1 THEN result1

WHEN condistion2 THEN result2

...

WHEN condistionN THEN resultN

ELSE default_result

END

例:

select product_id,product_type_id,

case

when product_type_id=1 then 'Book'

when product_type_id=2 then 'Video'

when product_type_id=3 then 'DVD'

when product_type_id=4 then 'CD'

else 'Magazine'

end

from products

這兩種方式,可以實(shí)現(xiàn)相同的功能。簡(jiǎn)單Case函數(shù)的寫(xiě)法相對(duì)比較簡(jiǎn)潔,但是和Case搜索函數(shù)相比,功能方面會(huì)有些限制,比如寫(xiě)判斷式。

還有一個(gè)需要注意的問(wèn)題,Case函數(shù)只返回第一個(gè)符合條件的值,剩下的Case部分將會(huì)被自動(dòng)忽略。

比如說(shuō),下面這段SQL,你永遠(yuǎn)無(wú)法得到“第二類(lèi)”這個(gè)結(jié)果

代碼如下:

CASE WHEN col_1 IN ( 'a', 'b') THEN '第一類(lèi)'

WHEN col_1 IN ('a') THEN '第二類(lèi)'

ELSE'其他' END

下面我們來(lái)看一下,使用Case函數(shù)都能做些什么事情。

一,已知數(shù)據(jù)按照另外一種方式進(jìn)行分組,分析。

有如下數(shù)據(jù):(為了看得更清楚,我并沒(méi)有使用國(guó)家代碼,而是直接用國(guó)家名作為Primary Key)

國(guó)家(country) 人口(population)

中國(guó) 600

美國(guó) 100

加拿大 100

英國(guó) 200

法國(guó) 300

日本 250

德國(guó) 200

墨西哥 50

印度 250

根據(jù)這個(gè)國(guó)家人口數(shù)據(jù),統(tǒng)計(jì)亞洲和北美洲的人口數(shù)量。應(yīng)該得到下面這個(gè)結(jié)果。

洲 人口

亞洲 1100

北美洲 250

其他 700

想要解決這個(gè)問(wèn)題,你會(huì)怎么做?生成一個(gè)帶有洲Code的View,是一個(gè)解決方法,但是這樣很難動(dòng)態(tài)的改變統(tǒng)計(jì)的方式。

如果使用Case函數(shù),SQL代碼如下

SELECT SUM(population),

CASE country

WHEN '中國(guó)' THEN '亞洲'

WHEN '印度' THEN '亞洲'

WHEN '日本' THEN '亞洲'

WHEN '美國(guó)' THEN '北美洲'

WHEN '加拿大' THEN '北美洲'

WHEN '墨西哥' THEN '北美洲'

ELSE '其他' END

FROM Table_A

GROUP BY CASE country

WHEN '中國(guó)' THEN '亞洲'

WHEN '印度' THEN '亞洲'

WHEN '日本' THEN '亞洲'

WHEN '美國(guó)' THEN '北美洲'

WHEN '加拿大' THEN '北美洲'

WHEN '墨西哥' THEN '北美洲'

ELSE '其他' END;

同樣的,我們也可以用這個(gè)方法來(lái)判斷工資的等級(jí),并統(tǒng)計(jì)每一等級(jí)的人數(shù)。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;

二,用一個(gè)SQL語(yǔ)句完成不同條件的分組。

有如下數(shù)據(jù)

國(guó)家(country) 性別(sex) 人口(population)

中國(guó) 1 340

中國(guó) 2 260

美國(guó) 1 45

美國(guó) 2 55

加拿大 1 51

加拿大 2 49

英國(guó) 1 40

英國(guó) 2 60

按照國(guó)家和性別進(jìn)行分組,得出結(jié)果如下

國(guó)家 男 女

中國(guó) 340 260

美國(guó) 45 55

加拿大 51 49

英國(guó) 40 60

普通情況下,用UNION也可以實(shí)現(xiàn)用一條語(yǔ)句進(jìn)行查詢(xún)。但是那樣增加消耗(兩個(gè)Select部分),而且SQL語(yǔ)句會(huì)比較長(zhǎng)。

下面是一個(gè)是用Case函數(shù)來(lái)完成這個(gè)功能的例子

代碼如下:

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,完成對(duì)二維表的輸出形式,充分顯示了Case函數(shù)的強(qiáng)大。

三,在Check中使用Case函數(shù)。

在Check中使用Case函數(shù)在很多情況下都是非常不錯(cuò)的解決方法??赡苡泻芏嗳烁揪筒挥肅heck,那么我建議你在看過(guò)下面的例子之后也嘗試一下在SQL中使用Check。

下面我們來(lái)舉個(gè)例子

公司A,這個(gè)公司有個(gè)規(guī)定,女職員的工資必須高于1000塊。如果用Check和Case來(lái)表現(xiàn)的話,如下所示

代碼如下:

CONSTRAINT check_salary CHECK

( CASE WHEN sex = '2'

THEN CASE WHEN salary > 1000

THEN 1 ELSE 0 END

ELSE 0 END )

如果單純使用Check,如下所示

代碼如下

CONSTRAINT check_salary CHECK

( sex = '2' AND salary > 1000 )

女職員的條件倒是符合了,男職員就無(wú)法輸入了。

實(shí)例

代碼如下

create table feng_test(id number, val varchar2(20);

insert into feng_test(id,val)values(1,'abcde');

insert into feng_test(id,val)values(2,'abc');

commit;

SQL>select * from feng_test;

id val

-------------------

1 abcde

2 abc

SQL>select id

, case when val like 'a%' then '1'

when val like 'abcd%' then '2'

else '999'

end case

from feng_test;

id case

---------------------

1 1

2 1

根據(jù)我自己的經(jīng)驗(yàn)我倒覺(jué)得在使用case when這個(gè)很像asp case when以在php swicth case開(kāi)發(fā)關(guān)語(yǔ)句的用法,只要有點(diǎn)基礎(chǔ)知道我覺(jué)得在sql中的case when其實(shí)也很好理解。

更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

更多信息請(qǐng)查看數(shù)據(jù)庫(kù)
易賢網(wǎng)手機(jī)網(wǎng)站地址:oracle case when的使用方法
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)