Oracle中的CASE語句可以很方便地實現數據處理和條件判斷。這個功能就像是Excel中的“IF”函數,可以根據條件判斷的結果,指定不同的返回值。
CASE語句的基本語法如下:
CASE expression WHEN value1 THEN statement1 WHEN value2 THEN statement2 ... ELSE statementN END;
expression 是需要進行判斷的值,value1、value2 等是表達式可能的取值,statement1、statement2 等則是對應的返回結果。ELSE關鍵字是可選的,表示所有可能的取值都不滿足條件時的默認返回結果。
例如,假設我們有一個表 t1,其中有兩列:salary 和 bonus。我們現在想計算 t1 的總收入,即 salary + bonus。如果 bonus 的值為 NULL,我們就將其看成 0。
SELECT salary, bonus, CASE WHEN bonus IS NULL THEN 0 ELSE bonus END AS new_bonus, salary + CASE WHEN bonus IS NULL THEN 0 ELSE bonus END AS total_income FROM t1;
在這個查詢語句中,我們使用了兩次CASE語句,第一次用于判斷是否將 NULL 視為 0,第二次用于計算總收入。當 bonus 的值為 NULL 時,我們通過第一次的 CASE 語句將 new_bonus 視為 0。然后在第二次的 CASE 語句中,我們同樣將 bonus 視為 0,這樣就可以正確地計算總收入了。
除了以上這種簡單的用法外,CASE 語句還可以嵌套,甚至可以產生復雜的邏輯分支。
SELECT grade, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' WHEN score >= 60 THEN 'D' ELSE 'F' END AS ranking FROM student;
在這個例子中,我們通過 CASE 語句來將學生的分數轉換成等級。如果分數高于等于 90,就是 A 等;如果分數在 80~89 之間,就是 B 等,以此類推。最后,ELSE 子句用于處理低于 60 分的情況,即 F 等。
在 Oracle 中,CASE 還支持解碼的功能。
SELECT gender, DECODE(gender, 'M', 'Male', 'F', 'Female', 'Unknown') AS new_gender FROM person;
在這個例子中,我們使用了 DECODE 函數來判斷性別,如果為 'M',返回 'Male',如果為 'F',返回 'Female',否則,返回 'Unknown'。
最后需要注意的是,CASE 語句也可以寫在 WHERE 子句中,這樣就可以進行條件篩選。
SELECT * FROM person WHERE CASE WHEN age >= 18 THEN 1 ELSE 0 END = 1;
在這個例子中,我們通過 CASE 語句來判斷年齡是否大于等于 18 歲。如果是,就返回 1,否則返回 0。然后,我們將這個值與 1 進行比較,如果相等,就將符合條件的記錄返回。這個查詢語句可以實現獲取所有年齡大于等于 18 歲的人員記錄。
總之,Oracle 的 CASE 語句是一個非常強大的功能,它可以簡化大量的數據處理工作,并且可以很靈活地處理各種復雜的邏輯分支。