SQL CASE 表達(dá)式是一種通用的條件表達(dá)式,類(lèi)似于其它語(yǔ)言中的 if/else 語(yǔ)句。
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
CASE 子句可以用于任何表達(dá)式可以有效存在的地方。 condition 是一個(gè)返回boolean 的表達(dá)式。 如果結(jié)果為真,那么 CASE 表達(dá)式的結(jié)果就是符合條件的 result。 如果結(jié)果為假,那么以相同方式搜尋任何隨后的 WHEN 子句。 如果沒(méi)有 WHEN condition 為真,那么 case 表達(dá)式的結(jié)果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且沒(méi)有匹配的條件, 結(jié)果為 NULL。
例子:
SELECT * FROM test;
a
---
1
2
3
SELECT a,
CASE WHEN a=1 THEN 'one'
WHEN a=2 THEN 'two'
ELSE 'other'
END
FROM test;
a | case
---+-------
1 | one
2 | two
3 | other
所有 result 表達(dá)式的數(shù)據(jù)的類(lèi)型都必須可以轉(zhuǎn)換成單一的輸出類(lèi)型。
下面這個(gè)"簡(jiǎn)單的" CASE 表達(dá)式是上面的通用形式的一個(gè)特殊的變種。
CASE expression
WHEN value THEN result
[WHEN ...]
[ELSE result]
END
先計(jì)算 expression 的值, 然后與所有在WHEN 子句里聲明的 value 對(duì)比,直到找到一個(gè)相等的。 如果沒(méi)有找到匹配的,則返回在 ELSE 子句里的 result (或者 NULL)。 這個(gè)類(lèi)似于 C 里的 switch
語(yǔ)句。
上面的例子可以用簡(jiǎn)單 CASE 語(yǔ)法來(lái)寫(xiě):
SELECT a,
CASE a WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'other'
END
FROM test;
a | case
---+-------
1 | one
2 | two
3 | other
CASE 表達(dá)式并不計(jì)算任何對(duì)于判斷結(jié)果并不需要的子表達(dá)式。 比如,下面是一個(gè)可以避免被零除的方法:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
例1:一道SQL語(yǔ)句面試題
表內(nèi)容:
2005-05-09 勝
2005-05-09 勝
2005-05-09 負(fù)
2005-05-09 負(fù)
2005-05-10 勝
2005-05-10 負(fù)
2005-05-10 負(fù)
如果要生成下列結(jié)果, 該如何寫(xiě)sql語(yǔ)句?
勝 負(fù)
2005-05-09 2 2
2005-05-10 1 2
----------------------------------------------------------
create table #tmp(rq varchar(10),shengfu nchar(1))
insert into #tmp values('2005-05-09','勝')
insert into #tmp values('2005-05-09','勝')
insert into #tmp values('2005-05-09','負(fù)')
insert into #tmp values('2005-05-09','負(fù)')
insert into #tmp values('2005-05-10','勝')
insert into #tmp values('2005-05-10','負(fù)')
insert into #tmp values('2005-05-10','負(fù)')
select rq, sum(case when shengfu='勝' then 1 else 0 end)'勝',
sum(case when shengfu='負(fù)' then 1 else 0 end)'負(fù)'
from #tmp group by rq
----------------------------------------------------------
例2:表中有A B C三列,用SQL語(yǔ)句實(shí)現(xiàn):當(dāng)A列大于B列時(shí)選擇A列否則選擇B列,當(dāng)B列大于C列時(shí)選擇B列否則選擇C列。
select (case when a>b then a else b end ),
(case when b>c then b esle c end)
from table_name
----------------------------------------------------------
例3:有一張表,里面有3個(gè)字段:語(yǔ)文,數(shù)學(xué),英語(yǔ)。其中有3條記錄分別表示語(yǔ)文70分,數(shù)學(xué)80分,英語(yǔ)58分,請(qǐng)用一條sql語(yǔ)句查詢(xún)出這三條記錄并按以下條件顯示出來(lái)(并寫(xiě)出您的思路):
大于或等于80表示優(yōu)秀,大于或等于60表示及格,小于60分表示不及格。
顯示格式:
語(yǔ)文 數(shù)學(xué) 英語(yǔ)
及格 優(yōu)秀 不及格
----------------------------------------------------------
select
(case when 語(yǔ)文>=80 then '優(yōu)秀'
when 語(yǔ)文>=60 then '及格'
else '不及格' end) as 語(yǔ)文,
(case when 數(shù)學(xué)>=80 then '優(yōu)秀'
when 數(shù)學(xué)>=60 then '及格'
else '不及格' end) as 數(shù)學(xué),
(case when 英語(yǔ)>=80 then '優(yōu)秀'
when 英語(yǔ)>=60 then '及格'
else '不及格' end) as 英語(yǔ),
from table
----------------------------------------------------------------