劉磊 林麗丹
摘要:實際研發工作中經常需要寫各種 SQL 來統計線上的各種業務數據或者需要以查詢的字段作為條件進行數據過濾操作,使用 CASE-WHEN 能讓統計事半功倍,用好CASE-WHEN,解決的問題更廣泛,邏輯上更為緊湊。文章首先介紹了業務需求,接著給出了實現方案,然后提供了實例代碼,最后總結了應用場景。
關鍵詞: MySQL;CASE;問卷調查;應用場景
中圖分類號: TP311? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2020)35-0228-02
開放科學(資源服務)標識碼(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? 業務需求分析
開發一個問卷調查系統,實現參與調查人員回答問卷,系統后臺進行結果統計的功能,要求系統能夠建立問卷,參與調查人員對問卷進行回答,提交后系統能夠自動對調查結果進行統計分析。
為實現系統功能,設計有一個item表,該表為不同問題的投票結果表,字段為編號、投票選項編號、投票問題內容編號、任務編號、調查對象編號,其中投票選項編號為某個問題的某個選項的編號,投票問題內容編號對應另一個表subject的記錄,表subject為問題內容表,其中有編號、問題內容、題型、問題內容類型、適用對象類型五個字段,任務編號對應選擇調查小組、調查單位組成的任務表的記錄,調查對象編號對應調查單位的對象,包括班子和具體個人。
對問卷調查結果進行統計,查詢出單人、班子中每個問題的得分情況,該案例是一個典型的聚合統計的例子,首先想到的是應用group by語句對問題進行分組,然后需要解決的問題就是分調查單位、調查對象統計,這就需要應用case when語句了。
2 實現方案
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子句都具有排他性,也就是說如果執行到某個 WHEN 子句為真,則剩余的 WHEN 子句不會執行,所以為了引起不必要的麻煩,WHEN 子句要注意條件的互斥性。
2)如果對數據庫字段取別名,字段別名一定要接在END的后面,否則會報錯。
2.3 case when的主要應用場景
1)場景一:首先,case when可以應用在對某列數據需要做條件判斷輸出問題中,例如在汽車銷量中對銷量進行分類,單月銷量小于3000臺的為不及格,單月銷量在3000-5000臺的為一般,單月銷量在5000-10000臺的為較好,單月銷量在10000臺以上的為優秀,case when就可以在這種場景中進行應用。
2)場景二:其次,case when還可以與聚合函數一起,應用在分類統計方面,例如在汽車銷量表中對銷量進行分細分市場分月統計。
3 實際運用
3.1 case when用在對某列數據需要做條件判斷輸出問題
在設計數據庫的時候總是會把用戶的性別用int存儲('0'為女,'1'為男),但是怎么把它轉換成漢字顯示呢,比如投票系統的用戶表,可以用如下語句實現。
select name as ‘名字 (case sex when 0 then ‘女 else ‘男 end)as ‘性別 from vote.user;
再如投票系統中的問題表,其中的問題種類用int存儲為1、2、3、4,在獲取所有問題進行顯示時,可以用如下語句實現。
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與聚合函數一起用在分類統計方面
對問卷調查結果進行統計,查詢出某個人、班子中每個問題的得分情況,可以用如下語句實現
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 結論
在實際工作中根據業務場景不同來靈活使用CASE WHEN,在SQL中能熟練地使用CASE,需要記住CASE的語法格式, 可以結合Java中case的用法來記憶,三種情況,第一:SQL中的 CASE expression,相當于 Java 中的 switch(expression);第二:SQL中的 WHEN value1 THEN returnvalue1,相當于Java中的case value : statement;第三:SQL中的 ELSE defaultreturnvalue,相當于Java中的 default: statement。
參考文獻:
[1] 李大印.基于復雜規則的在線投票考核系統實現[J].電腦編程技巧與維護,2020(4):41-43,58.
[2] 梁軒,楊文躍.基于Web的在線測評系統的設計與實現[J].電腦知識與技術,2019,15(24):68-69,76.
[3] 季玉茹,王德忠.基于SSH的校園網上投票系統的設計[J].電腦知識與技術,2017,13(29):60-61.
【通聯編輯:唐一東】