SQL中CASE條件表達式
SQL CASE 表達式是一種通用的條件表達式,類似于其它語言中的 if/else 語句。
CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
CASE 子句可以用于任何表達式可以有效存在的地方。 condition 是一個返回boolean 的表達式。 如果結果為真,那么 CASE 表達式的結果就是符合條件的 result。 如果結果為假,那么以相同方式搜尋任何隨后的 WHEN 子句。 如果沒有 WHEN condition 為真,那么 case 表達式的結果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且沒有匹配的條件, 結果為 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 表達式的數據的類型都必須可以轉換成單一的輸出類型。
下面這個"簡單的" CASE 表達式是上面的通用形式的一個特殊的變種。
CASE expression WHEN value THEN result [WHEN ...] [ELSE result] END
先計算 expression 的值, 然后與所有在WHEN 子句里聲明的 value 對比,直到找到一個相等的。 如果沒有找到匹配的,則返回在 ELSE 子句里的 result (或者 NULL)。 這個類似于 C 里的 switch
語句。
上面的例子可以用簡單 CASE 語法來寫:
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 表達式并不計算任何對于判斷結果并不需要的子表達式。 比如,下面是一個可以避免被零除的方法:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
例1:一道SQL語句面試題
表內容:
2005-05-09 勝
2005-05-09 勝
2005-05-09 負
2005-05-09 負
2005-05-10 勝
2005-05-10 負
2005-05-10 負
如果要生成下列結果, 該如何寫sql語句?
勝 負
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','負')
insert into #tmp values('2005-05-09','負')
insert into #tmp values('2005-05-10','勝')
insert into #tmp values('2005-05-10','負')
insert into #tmp values('2005-05-10','負')select rq, sum(case when shengfu='勝' then 1 else 0 end)'勝',
----------------------------------------------------------
sum(case when shengfu='負' then 1 else 0 end)'負'
from #tmp group by rq
----------------------------------------------------------
例2:表中有A B C三列,用SQL語句實現:當A列大于B列時選擇A列否則選擇B列,當B列大于C列時選擇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個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄并按以下條件顯示出來(并寫出您的思路):
大于或等于80表示優秀,大于或等于60表示及格,小于60分表示不及格。
顯示格式:
語文 數學 英語
及格 優秀 不及格
----------------------------------------------------------
select
(case when 語文>=80 then '優秀'
when 語文>=60 then '及格'
else '不及格' end) as 語文,
(case when 數學>=80 then '優秀'
when 數學>=60 then '及格'
else '不及格' end) as 數學,
(case when 英語>=80 then '優秀'
when 英語>=60 then '及格'
else '不及格' end) as 英語,
from table
----------------------------------------------------------------
posted on 2008-11-13 15:35 生命的綻放 閱讀(3167) 評論(0) 編輯 收藏 所屬分類: 數據庫