五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > sql中加入IF ELSE(CASE語句的使用)判斷語句

sql中加入IF ELSE(CASE語句的使用)判斷語句

文章來源:365jz.com     點(diǎn)擊數(shù):4907    更新時間:2017-12-02 11:21   參與評論
標(biāo)準(zhǔn)的sql語言是不支持if 這些判斷語句的,如果要加入條件,一般得用到where子句。
比如,要查找customer表中的人名為‘張三’的,寫成sql語句為
select * from customer where name='張三'。
在表達(dá)式中可以使用CASE語句達(dá)到IF()的效果。
例如:
SELECT MAX(CASE WHEN Field1>=Field2 THEN Field1 ELSE Field2) FROM TableName


IF 表達(dá)式

IF( expr1 , expr2 , expr3 )
expr1 的值為 TRUE,則返回值為 expr2
expr2 的值為FALSE,則返回值為 expr3


如下:


SELECT IF(TRUE,1+1,1+2);
-> 2

SELECT IF(FALSE,1+1,1+2);
-> 3

SELECT IF(STRCMP("111","222"),"不相等","相等");
-> 不相等


那么這個 IF 有啥用處呢?舉個例子:
查找出售價為 50 的書,如果是 java 書的話,就要標(biāo)注為 已售完
那么對應(yīng)的SQL語句該怎樣去寫呢?

select *,if(book_name='java','已賣完','有貨') as product_status from book where price =50


IFNULL 表達(dá)式

IFNULL( expr1 , expr2 )

在 expr1 的值不為 NULL的情況下都返回 expr1,否則返回 expr2,如下:

SELECT IFNULL(NULL,"11");
-> 11

SELECT IFNULL("00","11");
-> 00


大家對IF ELSE語句可能都很熟悉,它是用來對過程進(jìn)行控制的。在SQL的世界中CASE語句語句有類似的效果。下面簡單的介紹CASE語句的用法。考慮下面的情況,假設(shè)有個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表導(dǎo)出生成一個文件,要求性別為男或女,而不是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:假設(shè)user目前沒有值,然后你往user導(dǎo)入了一批數(shù)據(jù),但是很不幸,錯把男設(shè)置成為2,而把女設(shè)置成為1,現(xiàn)在要求你變換過來,怎么辦?

方法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
);

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

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

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='李四';

當(dāng)USER表的數(shù)據(jù)量非常大,而NAME字段上又沒有索引時,每條語句都要進(jìn)行全表掃描,如果這樣的語句有很多,效率會非常差,這時候我們可以用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 ('張三','李四');

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

---致謝:higny發(fā)現(xiàn)了本文的一個錯誤,在此表示嚴(yán)重感謝

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

----聲明:轉(zhuǎn)載請注明出處。

----last update at 2010.5.7

----write by wave at 2009.9.23

----end

一般項(xiàng)目開發(fā)中,我會直接使用sql在數(shù)據(jù)庫中先查詢出數(shù)據(jù),然后再對數(shù)據(jù)進(jìn)行顯示處理。
這樣做,不僅麻煩,而且效率不高。
其實(shí),可以直接在sql語句中操作,將從數(shù)據(jù)庫中查詢出來的信息不要直接放入結(jié)果集中,而是將這些信息轉(zhuǎn)換成頁面需要顯示的數(shù)據(jù)后再存入結(jié)果集中。
sql語句:

select 
case  
when oi.order_type_id='SALE' then '銷售' 
when oi.order_type_id='PURCHASE' then '采購' 
end as 訂單類型  
from order_info as oi; 


然后在結(jié)果集中取出字段名為‘訂單類型’的數(shù)據(jù)即可。

如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點(diǎn)擊進(jìn)入論壇

發(fā)表評論 (4907人查看0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號