PLSQL條件(CASE WHEN)語句小應用

13811135929發表於2017-05-05
  平時主要做維護方面工作,開發工作較少,沒怎麼認真的寫過幾行plsql程式碼。昨日一同事打電話諮詢一個小問題,當時覺得很簡單,但一時又想不出怎麼寫,後來靜下心來,終於把語句寫出來了。其實語句非常簡單,只不過是對plsql不熟而已,因此請開發大神莫要拍磚。看來以後還要多看一些開發類的書籍,以便不時之需啊。
 去除一些細節,可以歸納為如下內容:表t包含兩個欄位,deptno欄位為部門編號,id欄位為身份證號。

點選(此處)摺疊或開啟

  1. SQL> desc t
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     DEPTNO                                             NUMBER
     ID                                                 VARCHAR2(30)
其中ID有18位的,也有15位的,18位和15位的樣例如下:
18位身份證號:110108197211182718
15位身份證號:110108721118271
現在要統計每個部門人數,其中上述15位和18位的身份證號認為同一個人。
  背景已經說清楚了,怎麼寫語句呢?很顯然要對id列進行一下簡單的條件處理,然後在進行統計,這裡就用到了case when語句。  具體語法如下
  
  根據上面的語法,我們可以基於t表寫一條簡單的語句:

點選(此處)摺疊或開啟

  1. select deptno,
  2. (CASE length(id)
  3.   WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
  4.   WHEN 15 THEN id
  5. END) as id1
  6. from t
t表資料記錄:

點選(此處)摺疊或開啟

  1. SQL> select * from t;
  2.     DEPTNO ID
  3. ---------- ------------------------------
  4.          1 110108197211182718
  5.          1 110108721118271
  6.          3 110109721118271
  7.          1 110101198201019713
  8.          2 110103198201019713
執行CASE WHEN語句後輸出結果如下,可以看到透過CASE WHEN語句成功的將18位身份證號轉換為了15位。

點選(此處)摺疊或開啟

  1. SQL> select deptno,
  2. (CASE length(id)
  3.   WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
  4.   WHEN 15 THEN id
  5. END) as id1
  6. from t;
  7.     DEPTNO ID1
  8. ---------- ------------------------------
  9.          1 110108721118271
  10.          1 110108721118271
  11.          3 110109721118271
  12.          1 110101820101971
  13.          2 110103820101971
有了上述SQL後,剩下的就簡單了,經驗證結果正確。

點選(此處)摺疊或開啟

  1. SQL> select deptno,count(distinct(id1)) from
  2. (select deptno,
  3. (CASE length(id)
  4.   WHEN 18 THEN substr(id,1,6)||substr(id,9,9)
  5.   WHEN 15 THEN id
  6.  END) as id1
  7. from t)
  8. group by deptno;
  9.     DEPTNO COUNT(DISTINCT(ID1))
  10. ---------- --------------------
  11.          1 2
  12.          2 1
  13.          3 1






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29827284/viewspace-2138547/,如需轉載,請註明出處,否則將追究法律責任。

相關文章