|
寫SQL語句時,或在PL/SQL中,經(jīng)常需要在一個SQL語句中,根據(jù)不同的條件,有多種處理方法,如下面的例子:出售一種商品時,單價不同,折扣不同,對這種需求的處理,如果分情況處理,將會很麻煩,如果用Case語句,就可以在一條SQL語句中得到想要的結(jié)果。
Case的語法:
case when 條件A Then 結(jié)果A When 條件B 結(jié)果B....... else 結(jié)果N end和Decode 不同的是,Decode 只能針對固定的值,而 Case 可以用不是固定值,需是一個條件。
現(xiàn)在有以下的需求,有一個字符串,最后的兩位可能是 ’/R’ ,’/T’ 另外,有的后兩位沒有前面的’/R’ ,’/T’ ,現(xiàn)在針對不同的需要,要將 ’/R’ ,’/T’ 取掉,沒 ’/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語句做一些查詢,主要想完成類似交差表功能 下面的語句是針對pubs數(shù)據(jù)庫的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 這個語句只完成了我所要求的部分功能,現(xiàn)在我想再加一層并且關(guān)系的條件,例如stor_id=’6380’并且 payterms=60,stor_id=’6380’并且 payterms=30,stor_id=’7066’并且 payterms=60,stor_id=’7066’并且 payterms=30 這只是一種較簡單的情況,并且關(guān)系的條件可能會更多,要求這些語句不是由開發(fā)人員手工來寫,要由程序根據(jù)條件自動生成,所以一定要有規(guī)律,否則程序無法形成SQL語句
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語句是一個辦法,但比較麻煩也不太可能通用: 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ān)鍵字來創(chuàng)建字段,但是它還具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。
首先讓我們看一下 CASE 的語法。在一般的 SELECT 中,其語法如下:
SELECT <myColumnSpec> = CASE WHEN <A> THEN <somethingA> WHEN <B> THEN <somethingB> ELSE <somethingE> END
在上面的代碼中需要用具體的參數(shù)代替尖括號中的內(nèi)容。下面是一個簡單的例子:
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 其實可以做更多的事情。比方說下面的 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
你甚至還可以組合這些選項,添加一個 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,查詢語句需要在 GROUP BY 塊中重復(fù) SELECT 塊中的 CASE 塊。
除了選擇自定義字段之外,在很多情況下 CASE 都非常有用。再深入一步,你還可以得到你以前認(rèn)為不可能得到的分組排序結(jié)果集。
|