劉磊 林麗丹
摘要:實際研發(fā)工作中經(jīng)常需要寫各種 SQL 來統(tǒng)計線上的各種業(yè)務(wù)數(shù)據(jù)或者需要以查詢的字段作為條件進行數(shù)據(jù)過濾操作,使用 CASE-WHEN 能讓統(tǒng)計事半功倍,用好CASE-WHEN,解決的問題更廣泛,邏輯上更為緊湊。文章首先介紹了業(yè)務(wù)需求,接著給出了實現(xiàn)方案,然后提供了實例代碼,最后總結(jié)了應(yīng)用場景。
關(guān)鍵詞: MySQL;CASE;問卷調(diào)查;應(yīng)用場景
中圖分類號: TP311? ? ? ? 文獻標(biāo)識碼:A
文章編號:1009-3044(2020)35-0228-02
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
Application of Case-when in MySQL
LIU Lei1,LIN Li-dan 2
(1.He nan Police College,Zhengzhou 450000, China;2.Luo he Vocational Technology College, Luohe 462000, China)
Abstract: In the actual research and development work, it is often necessary to write all kinds of SQL to statistic all kinds of online business data or to perform data filtering operation under the condition of query-field. The use of case-when can double the result with half the effort and solve more extensive and logically more compact problems. This paper introduces the business requirements, and then gives the implementation scheme, and then provides the example code, finally summarizes the application scenario.
Key words:MySQL; CASE;questionnaire survey; application scenarios
1? 業(yè)務(wù)需求分析
開發(fā)一個問卷調(diào)查系統(tǒng),實現(xiàn)參與調(diào)查人員回答問卷,系統(tǒng)后臺進行結(jié)果統(tǒng)計的功能,要求系統(tǒng)能夠建立問卷,參與調(diào)查人員對問卷進行回答,提交后系統(tǒng)能夠自動對調(diào)查結(jié)果進行統(tǒng)計分析。
為實現(xiàn)系統(tǒng)功能,設(shè)計有一個item表,該表為不同問題的投票結(jié)果表,字段為編號、投票選項編號、投票問題內(nèi)容編號、任務(wù)編號、調(diào)查對象編號,其中投票選項編號為某個問題的某個選項的編號,投票問題內(nèi)容編號對應(yīng)另一個表subject的記錄,表subject為問題內(nèi)容表,其中有編號、問題內(nèi)容、題型、問題內(nèi)容類型、適用對象類型五個字段,任務(wù)編號對應(yīng)選擇調(diào)查小組、調(diào)查單位組成的任務(wù)表的記錄,調(diào)查對象編號對應(yīng)調(diào)查單位的對象,包括班子和具體個人。
對問卷調(diào)查結(jié)果進行統(tǒng)計,查詢出單人、班子中每個問題的得分情況,該案例是一個典型的聚合統(tǒng)計的例子,首先想到的是應(yīng)用group by語句對問題進行分組,然后需要解決的問題就是分調(diào)查單位、調(diào)查對象統(tǒng)計,這就需要應(yīng)用case when語句了。
2 實現(xiàn)方案
2.1 CASE 表達式的寫法
CASE 表示式有簡單表達式和搜索表達式兩種。
1) 簡單 CASE 表達式
在MySql中格式:
case 要判斷的字段/表達式
when 常量1 then 要顯示的值1或語句1;(如果是語句要加分號)
when 常量2 then 要顯示的值2或語句2;
……
else? 要顯示的值n或語句n;
end
then后面如果是常量值不需要分號,如果是語句則要加分號。這個格式的用法類似java中的switch的效果,例如
CASE sex
WHEN? '1'? THEN? '男'
WHEN? '2'? THEN? '女'? ELSE? '其他'
END
2) 搜索 CASE 表達式
在MySql中:
case (case后什么都沒有,沒有需要判斷的東西)
when? 條件1 then 要顯示的值1或語句1;
when? 條件2 then 要顯示的值2或語句2;
……
else? ?要顯示的值n或語句n
End
這個格式的用法類似java中的多重if的效果,例如:
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女' ELSE '其他'
END
2.2 注意要點
1)每個WHEN子句都具有排他性,也就是說如果執(zhí)行到某個 WHEN 子句為真,則剩余的 WHEN 子句不會執(zhí)行,所以為了引起不必要的麻煩,WHEN 子句要注意條件的互斥性。
2)如果對數(shù)據(jù)庫字段取別名,字段別名一定要接在END的后面,否則會報錯。
2.3 case when的主要應(yīng)用場景
1)場景一:首先,case when可以應(yīng)用在對某列數(shù)據(jù)需要做條件判斷輸出問題中,例如在汽車銷量中對銷量進行分類,單月銷量小于3000臺的為不及格,單月銷量在3000-5000臺的為一般,單月銷量在5000-10000臺的為較好,單月銷量在10000臺以上的為優(yōu)秀,case when就可以在這種場景中進行應(yīng)用。
2)場景二:其次,case when還可以與聚合函數(shù)一起,應(yīng)用在分類統(tǒng)計方面,例如在汽車銷量表中對銷量進行分細分市場分月統(tǒng)計。
3 實際運用
3.1 case when用在對某列數(shù)據(jù)需要做條件判斷輸出問題
在設(shè)計數(shù)據(jù)庫的時候總是會把用戶的性別用int存儲('0'為女,'1'為男),但是怎么把它轉(zhuǎn)換成漢字顯示呢,比如投票系統(tǒng)的用戶表,可以用如下語句實現(xiàn)。
select name as ‘名字 (case sex when 0 then ‘女 else ‘男 end)as ‘性別 from vote.user;
再如投票系統(tǒng)中的問題表,其中的問題種類用int存儲為1、2、3、4,在獲取所有問題進行顯示時,可以用如下語句實現(xiàn)。
SELECT a.vs_id, a.vs_title,case when a.vs_kind = '1' THEN '(一)' WHEN a.vs_kind = '2' THEN '(二)' WHEN a.vs_kind = '3' THEN '(三)' WHEN a.vs_kind = '4' THEN '(四)' END vs_kind, b.opt_item, c.resp_item FROM vote_subject a LEFT JOIN (SELECT t.vs_id, group_concat(t.vo_id, '-', t.vo_option order by vo_order) opt_item FROM vote_option t GROUP BY t.vs_id) b ON a.vs_id = b.vs_id
3.2 case when與聚合函數(shù)一起用在分類統(tǒng)計方面
對問卷調(diào)查結(jié)果進行統(tǒng)計,查詢出某個人、班子中每個問題的得分情況,可以用如下語句實現(xiàn)
SELECT vsId,
sum(CASE when vsKind = '第一類' then VoteCoun end) `countA`,
sum(CASE when vsKind = '第二類' then VoteCoun end) `countB`,
sum(CASE when vsKind = '第三類' then VoteCoun end) `countC`
sum(CASE when vsKind = '第四類' then VoteCoun end) `countD`
from Option? ?where vsId <> 'Null'? ?group by vsId;
4 結(jié)論
在實際工作中根據(jù)業(yè)務(wù)場景不同來靈活使用CASE WHEN,在SQL中能熟練地使用CASE,需要記住CASE的語法格式, 可以結(jié)合Java中case的用法來記憶,三種情況,第一:SQL中的 CASE expression,相當(dāng)于 Java 中的 switch(expression);第二:SQL中的 WHEN value1 THEN returnvalue1,相當(dāng)于Java中的case value : statement;第三:SQL中的 ELSE defaultreturnvalue,相當(dāng)于Java中的 default: statement。
參考文獻:
[1] 李大印.基于復(fù)雜規(guī)則的在線投票考核系統(tǒng)實現(xiàn)[J].電腦編程技巧與維護,2020(4):41-43,58.
[2] 梁軒,楊文躍.基于Web的在線測評系統(tǒng)的設(shè)計與實現(xiàn)[J].電腦知識與技術(shù),2019,15(24):68-69,76.
[3] 季玉茹,王德忠.基于SSH的校園網(wǎng)上投票系統(tǒng)的設(shè)計[J].電腦知識與技術(shù),2017,13(29):60-61.
【通聯(lián)編輯:唐一東】