熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracle case when的使用方法

2013-11-13 22:25:35  來源: Oracle 

  Case when 的用法簡單Case函數
簡單CASE表達式使用表達式確定返回值

  語法:

  CASE search_expression

  WHEN expression THEN result

  WHEN expression THEN result

  

  WHEN expressionN THEN resultN

  ELSE default_result

  搜索CASE表達式使用條件確定返回值

  語法:

  CASE

  WHEN condition THEN result

  WHEN condistion THEN result

  

  WHEN condistionN THEN resultN

  ELSE default_result

  END

  例:

  select product_idproduct_type_id

  case

  when product_type_id= then Book

  when product_type_id= then Video

  when product_type_id= then DVD

  when product_type_id= then CD

  else Magazine

  end

  from products 

  這兩種方式可以實現相同的功能簡單Case函數的寫法相對比較簡潔但是和Case搜索函數相比功能方面會有些限制比如寫判斷式

  還有一個需要注意的問題Case函數只返回第一個符合條件的值剩下的Case部分將會被自動忽略

  比如說下面這段SQL你永遠無法得到“第二類”這個結果

  代碼如下  
 

  CASE WHEN col_ IN ( a b) THEN 第一類

  WHEN col_ IN (a)       THEN 第二類

  ELSE其他 END
 

  下面我們來看一下使用Case函數都能做些什麼事情

  一已知數據按照另外一種方式進行分組分析

  有如下數據:(為了看得更清楚我並沒有使用國家代碼而是直接用國家名作為Primary Key)

  國家(country) 人口(population)

  中國

  美國

  加拿大

  英國

  法國

  日本

  德國

  墨西哥

  印度

  根據這個國家人口數據統計亞洲和北美洲的人口數量應該得到下面這個結果

  洲 人口

  亞洲

  北美洲

  其他

  想要解決這個問題你會怎麼做?生成一個帶有洲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 <= THEN

  WHEN salary > AND salary <= THEN

  WHEN salary > AND salary <= THEN

  WHEN salary > AND salary <= THEN

  ELSE NULL END salary_class

  COUNT(*)

  FROM    Table_A

  GROUP BY

  CASE WHEN salary <= THEN

  WHEN salary > AND salary <= THEN

  WHEN salary > AND salary <= THEN

  WHEN salary > AND salary <= THEN

  ELSE NULL END;

  二用一個SQL語句完成不同條件的分組

  有如下數據

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

  中國

  中國

  美國

  美國

  加拿大

  加拿大

  英國

  英國

  按照國家和性別進行分組得出結果如下

  國家 男 女

  中國

  美國

  加拿大

  英國

  普通情況下用UNION也可以實現用一條語句進行查詢但是那樣增加消耗(兩個Select部分)而且SQL語句會比較長

  下面是一個是用Case函數來完成這個功能的例子

  代碼如下 
SELECT country

  SUM( CASE WHEN sex = THEN

  population ELSE END) 男性人口

  SUM( CASE WHEN sex = THEN

  population ELSE END)   女性人口

  FROM Table_A

  GROUP BY country;

  這樣我們使用Select完成對二維表的輸出形式充分顯示了Case函數的強大

  三在Check中使用Case函數

  在Check中使用Case函數在很多情況下都是非常不錯的解決方法可能有很多人根本就不用Check那麼我建議你在看過下面的例子之後也嘗試一下在SQL中使用Check

  下面我們來舉個例子

  公司A這個公司有個規定女職員的工資必須高於如果用Check和Case來表現的話如下所示

  代碼如下 
CONSTRAINT check_salary CHECK

  ( CASE WHEN sex =

  THEN CASE WHEN salary >

  THEN ELSE END

  ELSE END ) 

  如果單純使用Check如下所示

  代碼如下

  CONSTRAINT check_salary CHECK

  ( sex = AND salary >

  女職員的條件倒是符合了男職員就無法輸入了

  實例

  代碼如下

  create table feng_test(id number val varchar();

  insert into feng_test(idval)values(abcde);
insert into feng_test(idval)values(abc);
commit;

  SQL>select * from feng_test;

  id            val

             abcde
             abc

  SQL>select id
     case when val like a% then
          when val like abcd% then
     else
    end case
from feng_test;

  id             case

                 
                 
 

  根據我自己的經驗我倒覺得在使用case when這個很像asp case when以在php swicth case開發關語句的用法只要有點基礎知道我覺得在sql中的case when其實也很好理解


From:http://tw.wingwit.com/Article/program/Oracle/201311/19085.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.