1. 程式人生 > >數據庫之Case When

數據庫之Case When

data- 沒有 lec 的人 返回 bsp end 中國 .net

近期幾天的工作本來組長是安排我用mindfocion畫幾個圖,本來以為難點是這個控件的使用,可是開發的時候才發現由於數據量有點多,所以在開發的時候匯總這些信息倒是費了我許多的功夫,最後總結一下就是寫了幾個SQL語句,這裏與大家分享一下。假設有須要用的就太好了。

先說一下需求,組長讓我畫一個圖。要求是把近期幾年的**信息統計一下,比如2012年這個**交接了多少次,2013年多少次,總共多少次。想想也不難是吧,於是組長問我怎麽樣,我就輕松的接下來了。

可是曾經一直接觸的是簡單的SQL語句和一些EntityFramework等工具,對於SQL語句就真的把我難住了。寫了一天的SQL語句,也是沒有達到想要的效果。後來上網看了一下,原來SQL裏邊有一個Case When語句。

用途

當我們在寫SQL語句的時候,假設遇到這麽一種情況,就是假如。

。。

。則。

。,否則。

。比如,增加是城市是北京,就返回時中國城市,假設是東京,就返回日本城池。否則返回西歐城市。

這個請款下我們就能夠用到這個,比例如以下邊的小樣例。

select 
  case when t.name = ‘北京‘ then ‘中國‘ 
  case when t.name = ‘東京‘ then ‘日本‘ 
  else ‘西歐‘
  end
from test1 t
當然這還是一個簡答的應用,比如我這次項目中用的CaseWhen的使用方法。就用到了條件篩選和SQL語句,比如我要查詢2014年叫lisi的人有多少,2015年lisi的人有多少。那麽下邊的語句就能幫我簡單的實現

select to_char(t.birthday ,‘yyyy‘),
  sum(case when to_char(t.birthday ,‘yyyy‘)= ‘2014‘ and t.name = ‘lisi‘ then 1
  when to_char(t.birthday ,‘yyyy‘)= ‘2015‘ and t.name = ‘lisi‘ then 1
  else 0
  end) as firYear
from test1 t group by to_char(t.birthday ,‘yyyy‘);
大家自己觀察發現我在上邊用到了Group by來進行分組。由於假設沒有這個的話,查詢出來的結果例如以下圖

技術分享

可是假設使用了group by分組的話,效果例如以下

技術分享

實現的效果不一樣,所以大家須要什麽樣子的表格。就怎麽查詢就能夠。

事實上上邊說了這麽多,好像就是一個if...else...,可是這個是全部數據庫都能夠實現的。可是在Oracle。另一個類似於咱們的三目運算的一個小語法。

select decode(sex, ‘M‘, ‘Male‘, ‘F‘, ‘Female‘, ‘Unknown‘)
from   employees;
當然假設咱們的邏輯簡單能夠用這個,只是邏輯略微復雜一些的建議不要用,感覺沒有CaseWhen的邏輯清晰,並且代碼的移植性也不太好。畢竟僅僅有Oracle能用。

總結一下,假設我們須要在數據庫中進行邏輯推斷。不防用一下咱們的CaseWhen,或者Oracle的decode。加上group by 效果更佳。

數據庫之Case When