在 SQL 中咱們一般認爲如下兩種寫法是等價的:數據庫
DECODE(PARAM, VALUE1, RESULT1 {, VALUE2, RESULT2} [, DEFAULT_RESULT])函數
CASE PARAM WHEN VALUE1 THEN RESULT1 {WHEN VALUE2 THEN RESULT2} [ELSE DEFAULT_RESULT] ENDspa
- 雖然一個叫函數,一個叫表達式,但實際上兩者都在行爲上都很像 IF-ELSIF-ELSE 流程控制語句,會按書寫順序執行判斷,遇到符合條件的狀況則返回相應的值,後面的狀況涉及到的語句不會被執行(例如開銷較大的函數);
- 均可以省略默認值的(CASE 省略默認值的方式是不寫 ELSE 子句),若是省略默認值但又未找到匹配則返回 NULL;
- 均可以在 SQL 中任何須要「值」的地方使用;
實際上 DECODE 和 CASE-WHEN 仍是有一些差異的,我把本身知道的列在了下面,歡迎讀者補充!ci
DECODE | CASE-WHEN | |
適用數據庫 | Oracle 專屬 | SQL 標準 |
可用於 PL/SQL | 否 | 是 |
特殊匹配邏輯 | NULL 可與 NULL 匹配 (一般狀況下 NULL 不會與任何值相等,只能用 IS NULL 判斷) |
如 CASE 後沒有表達式 可在 WHEN 和 THEN 中填寫任意條件表達式 |
返回值類型不一樣時 | 某個返回值在語句執行中實際返回時, 向第一個返回值的類型隱式轉換 |
全部返回值在語句解析時, 與第一個返回值類型保持一致 |