在資料庫開發中,經常需要根據條件返回不同的值。Oracle 提供了方便的 DECODE 函數,而 MySQL 則可以使用 CASE WHEN 語句達到相同效果。本文分享兩種資料庫的對應寫法,並提供測試通過的代碼範例。
首先建立一個臨時表並插入測試資料:
CREATE TEMPORARY TABLE tmp (a INT, b INT, c INT);
INSERT INTO tmp VALUES (1,10,1), (10,10,2), (10,100,2);
MySQL 中使用標準 SQL 的 CASE WHEN 語法:
SELECT SUM(CASE WHEN c = '1' THEN a ELSE b END) FROM tmp;
Oracle 專有的 DECODE 函數語法更簡潔:
SELECT SUM(DECODE(c, '1', a, b)) FROM tmp;
若不想使用條件表達式,也可用 UNION 組合查詢:
SELECT SUM(d) FROM (
SELECT a AS d FROM tmp WHERE c = 1
UNION
SELECT b AS d FROM tmp WHERE c = 2
) AS subquery;
CASE WHEN 是 ANSI SQL 標準,移植性較好;DECODE 則是 Oracle 專屬語法,寫法更緊湊。根據專案使用的資料庫選擇適當方案即可。測試環境為 MySQL,MSSQL 理論上也能執行但未實測。
