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