寫SQL語(yǔ)句時(shí),或在PL/SQL中,經(jīng)常需要在一個(gè)SQL語(yǔ)句中,根據(jù)不同的條件,有多種處理方法,如下面的例子:出售一種商品時(shí),單價(jià)不同,折扣不同,對(duì)這種需求的處理,如果分情況處理,將會(huì)很麻煩,如果用Case語(yǔ)句,就可以在一條SQL語(yǔ)句中得到想要的結(jié)果。
Case的語(yǔ)法:
case when 條件A Then 結(jié)果A When 條件B 結(jié)果B....... else 結(jié)果N end和Decode 不同的是,Decode 只能針對(duì)固定的值,而 Case 可以用不是固定值,需是一個(gè)條件。
現(xiàn)在有以下的需求,有一個(gè)字符串,最后的兩位可能是 ’/R’ ,’/T’ 另外,有的后兩位沒(méi)有前面的’/R’ ,’/T’ ,現(xiàn)在針對(duì)不同的需要,要將 ’/R’ ,’/T’ 取掉,沒(méi) ’/R’ ,’/T’, 就不做處理。
A01JCL-A01JCL/GF117F0001TR/RSQL寫法:
select (case
when instr(code, ’/R’) > 0 then
substr(code, 1, instr(code, ’/R’) - 1)
when instr(code, ’/T’) > 0 then
substr(code, 1, instr(code, ’/T’) - 1)
else
’0’
end)
from table_A t ;
利用case語(yǔ)句做一些查詢,主要想完成類似交差表功能
下面的語(yǔ)句是針對(duì)pubs數(shù)據(jù)庫(kù)的sales表編寫的
SELECT SUM(CASE sales.stor_id WHEN '6380' THEN sales.qty ELSE 0 END) AS col1,
SUM(CASE sales.stor_id WHEN '7066' THEN sales.qty ELSE 0 END) AS col2
FROM sales
這個(gè)語(yǔ)句只完成了我所要求的部分功能,現(xiàn)在我想再加一層并且關(guān)系的條件,例如stor_id=’6380’并且 payterms=60,stor_id=’6380’并且 payterms=30,stor_id=’7066’并且 payterms=60,stor_id=’7066’并且 payterms=30
這只是一種較簡(jiǎn)單的情況,并且關(guān)系的條件可能會(huì)更多,要求這些語(yǔ)句不是由開(kāi)發(fā)人員手工來(lái)寫,要由程序根據(jù)條件自動(dòng)生成,所以一定要有規(guī)律,否則程序無(wú)法形成SQL語(yǔ)句
SELECT SUM(CASE WHEN sales.stor_id='6380' and payterms=60 THEN sales.qty ELSE 0 END) AS col1,
SUM(CASE WHEN sales.stor_id='6380' and payterms=30 THEN sales.qty ELSE 0 END) AS col2,
SUM(CASE sales.stor_id WHEN '7066' and payterms=60 THEN sales.qty ELSE 0 END) AS col3,
SUM(CASE sales.stor_id WHEN '7066' and payterms=30 THEN sales.qty ELSE 0 END) AS col4
FROM sales
如下湊出SQL語(yǔ)句是一個(gè)辦法,但比較麻煩也不太可能通用:
SELECT SUM(CASE WHEN sales.stor_id='6380' and payterms=60 THEN sales.qty ELSE 0 END) AS col1,
SUM(CASE WHEN sales.stor_id='6380' and payterms=30 THEN sales.qty ELSE 0 END) AS col2,
SUM(CASE WHEN sales.stor_id ='7066' and payterms=60 THEN sales.qty ELSE 0 END) AS col3,
SUM(CASE WHEN sales.stor_id ='7066' and payterms=30 THEN sales.qty ELSE 0 END) AS col4
FROM sales
CASE 可能是 SQL 中被誤用最多的關(guān)鍵字之一。雖然你可能以前用過(guò)這個(gè)關(guān)鍵字來(lái)創(chuàng)建字段,但是它還具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。
首先讓我們看一下 CASE 的語(yǔ)法。在一般的 SELECT 中,其語(yǔ)法如下:
SELECT <myColumnSpec> =
CASE
WHEN <A> THEN <somethingA>
WHEN <B> THEN <somethingB>
ELSE <somethingE>
END
在上面的代碼中需要用具體的參數(shù)代替尖括號(hào)中的內(nèi)容。下面是一個(gè)簡(jiǎn)單的例子:
USE pubs
GO
SELECT
Title,
'Price Range' =
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
FROM titles
ORDER BY price
GO
這是 CASE 的典型用法,但是使用 CASE 其實(shí)可以做更多的事情。比方說(shuō)下面的 GROUP BY 子句中的 CASE:
SELECT 'Number of Titles', Count(*)
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
GO
你甚至還可以組合這些選項(xiàng),添加一個(gè) ORDER BY 子句,如下所示:
USE pubs
GO
SELECT
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END AS Range,
Title
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
ORDER BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
GO
注意,為了在 GROUP BY 塊中使用 CASE,查詢語(yǔ)句需要在 GROUP BY 塊中重復(fù) SELECT 塊中的 CASE 塊。
除了選擇自定義字段之外,在很多情況下 CASE 都非常有用。再深入一步,你還可以得到你以前認(rèn)為不可能得到的分組排序結(jié)果集。
聯(lián)系客服