oracle語句增加邏輯判斷-很實用____oracle

來源:互聯網
上載者:User
  Oracle提供了一些邏輯判斷函數,這些函數可以在查詢中使用。     1,針對空值進行測試-NVL函數     函數原型為:NVL(testValue,SubstituteValue)     常見的用法是  Select max(score) From SC Where Name=‘Jerry’     有時max(score)為空白,也就是說Jerry並沒有考試記錄,這時我們用"No Record"標註一下:     Select NVL(max(score),"No Record") From SC;       還有一個NVL2函數跟其相似,函數原型為: NVL(testValue,SubValue1,SubValue2) NVL2函數實現的是若testValue為NULL,返回SubValue1,否則返回SubValue2。     2,更廣泛意義上的測試-Decode函數    Decode函數的原型為: Decode(testValue, if1, then1, if2,then2.....else).    針對testValue進行測試,若testValue等於if1則返回then1,若testValue等於if2則返回then2,....若都沒有返回,剛返回else.    常見用法是在Oracle中實現行轉列(Convert Rows to Columns). CLASS  COURSE  STUDENT                                 
-----  ------   ------
11  Engish   D
11  Engish   F
11  Engish   E
11  Math     F
11  Math     D
22  Engish   C
22  Engish   B
22  History  A
22  History  B
22  Math     B
22  Math     C
   我想針對知道11和22班選修English,Math,History各有多少名同學。

SELECT course, SUM (DECODE (class, 11, 1, 0)) AS "Class-11",
               SUM (DECODE (class, 22, 1, 0)) AS "Class-22"
   FROM studentinfo
   GROUP BY course

   在這裡我們先對class進行測試,若為11,我們返回1,若不是11我們返回0,再對結果進行sum,即可以知道,11班有共有多少同學。再按Course分組,便可以得出: COURSE   Class-11   Class-22                              
-------  --------   -----
Engish   3            2                                     
Math     2            3                                     History  0            2         這個解決方案有一個限制就是:你必須預Crowdsourced Security Testing道有幾個class,但若這些class是不固定的,那這個解決方案就不適用了。    針對此限制,SQL部分不太容易解決,可以在程式中workaround.
比如現在加了一個班級號為33的記錄:   33  Match  A
在程式中動態構建SQL時在From語言之前加入,,SUM (DECODE (CLASS, 33, 1, 0)) AS "Class-33")     3,更可讀的邏輯測試-Case語句    上面的Decode函數參數數目不定,看上去容易讓人迷糊,Oracle提供了另一種語句來實作類別似功能,但可讀性更高。    如果我們要針對上表的同學欄位進行重新命名: A: Anco B: Bily C: Candy D: Davi E:  Eve F:  Fion   若我們用Decode可以這樣實現:

SELECT class, course,
       DECODE (student,
               'A', 'Anco',
               'B', 'Bily',
               'C', 'Candy',
               'D', 'Davi',
               'E', 'Eve',
               'F', 'Fion'
              ) AS en_name
  FROM studentinfo

  同樣的也可以用Case語句實現:

SELECT CLASS, course,
       (CASE student
           WHEN 'A' THEN 'Anco'
           WHEN 'B' THEN 'Bily'
           WHEN 'C' THEN 'Candy'
           WHEN 'D' THEN 'Davi'
           WHEN 'E' THEN 'Eve'
           WHEN 'F' THEN 'Fion'
        END) AS en_name
  FROM studentinfo

   轉自:http://blog.chinaunix.net/uid-576762-id-2733790.html                

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.