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"),"不相等","相等");
-> 不相等
select *,if(book_name='java','已賣完','有貨') as product_status from book where price =50
在 expr1 的值不為 NULL的情況下都返回 expr1,否則返回 expr2,如下:IFNULL( 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)入論壇