SQL中的IF ELSE(CASE語句的使用)


大家對IF ELSE語句可能都很熟悉,它是用來對過程進行控制的。在SQL的世界中CASE語句語句有類似的效果。下面簡單的介紹CASE語句的用法。考慮下面的情況,假設有個user表,定義如下:

CREATE TABLE USER   
(   
NAME VARCHAR(20) NOT NULL,---姓名   
SEX INTEGER,---性別(1、男   2、女)   
BIRTHDAY DATE---生日   
);  
CREATE TABLE USER
(
NAME VARCHAR(20) NOT NULL,---姓名
SEX INTEGER,---性別(1、男 2、女)
BIRTHDAY DATE---生日
);

CASE使用場合1:把user表導出生成一個文件,要求性別為男或女,而不是1和2,怎么辦?我們可以用如下的語句處理:

SELECT    
    NAME,   
    CASE SEX   
        WHEN 1 THEN '男'  
        ELSE '女'  
    END AS SEX,   
    BIRTHDAY   
FROM USER;  
SELECT 
 NAME,
 CASE SEX
  WHEN 1 THEN '男'
  ELSE '女'
 END AS SEX,
 BIRTHDAY
FROM USER;
 

CASE使用場合2:假設user目前沒有值,然后你往user導入了一批數據,但是很不幸,錯把男設置成為2,而把女設置成為1,現在要求你變換過來,怎么辦?

方法1:使用三條語句,先把2更新成3,接着把1更新成2,最后把3更新成1,很麻煩,不是嗎?

UPDATE USER SET SEX=3 WHERE SEX=2;   
UPDATE USER SET SEX=1 WHERE SEX=3;   
UPDATE USER SET SEX=2 WHERE SEX=1;  
UPDATE USER SET SEX=3 WHERE SEX=2;
UPDATE USER SET SEX=1 WHERE SEX=3;
UPDATE USER SET SEX=2 WHERE SEX=1;

方法2:使用CASE語句

UPDATE USER SET SEX=   
(   
CASE SEX   
WHEN 1 THEN 2   
WHEN 2 THEN 1   
ELSE SEX   
END   
);  
UPDATE USER SET SEX=
(
CASE SEX
WHEN 1 THEN 2
WHEN 2 THEN 1
ELSE SEX
END
);

      細心的朋友可能已經發現了,上面的方法1的三條語句的執行順序有問題,沒錯,是我故意那些寫的,僅僅是把1變成2,把2變成1就那么麻煩,而且很容易出錯,想象一下,如果有很多這樣的值需要變換,那是一種什么樣的情況。還好,我們有CASE語句,有好多這樣的值需要變換,CASE語句也不會存在問題。可能有些朋友還是有疑慮,這樣做會不會死循環啊?哈哈,想法很好,如果你發現這樣做會死循環,一定要告訴IBM,我反正沒發現。

CASE使用場合3:假設讓你把張三的生日更新成1949-10-1,李四的生日更新成1997-7-1等,類似這樣的更新由很多。該怎么辦呢?非常簡單,大多數人會這么做。

update USER set BIRTHDAY='1949-10-1' where NAME='張三';   
update USER set BIRTHDAY='1997-7-1' where NAME='李四';  
update USER set BIRTHDAY='1949-10-1' where NAME='張三';
update USER set BIRTHDAY='1997-7-1' where NAME='李四';

當USER表的數據量非常大,而NAME字段上又沒有索引時,每條語句都要進行全表掃描,如果這樣的語句有很多,效率會非常差,這時候我們可以用CASE語句,如下:

UPDATE USER SET BIRTHDAY=   
(   
CASE NAME   
WHEN '張三' THEN '1949-10-1'  
WHEN '李四' THEN '1997-7-1'  
ELSE BIRTHDAY   
END   
)   
where NAME in ('張三','李四');  
UPDATE USER SET BIRTHDAY=
(
CASE NAME
WHEN '張三' THEN '1949-10-1'
WHEN '李四' THEN '1997-7-1'
ELSE BIRTHDAY
END
)
where NAME in ('張三','李四');

以上語句只進行一次全表掃描,效率非常高。

---致謝:higny發現了本文的一個錯誤,在此表示嚴重感謝

---更多參見:DB2 SQL 精要

----聲明:轉載請注明出處。

----last update at 2010.5.7

----write by wave at 2009.9.23

----end

 

http://blog.csdn.net/courageously/article/details/5769757


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM