-- 簡單 CASE(等值判斷,類似 SWITCH)
CASE expr
WHEN val1 THEN res1
WHEN val2 THEN res2
...
ELSE def_res
END
-- 搜索 CASE(條件判斷,類似 IF-ELSEIF)
CASE
WHEN cond1 THEN res1
WHEN cond2 THEN res2
...
ELSE def_res
END
-- Oracle DECODE
SELECT DECODE(MONTH(shipped_date),
1, 'Jan', 2, 'Feb', 3, 'Mar', 4, 'Apr',
5, 'May', 6, 'Jun', 7, 'Jul', 8, 'Aug',
9, 'Sep', 10, 'Oct', 11, 'Nov', 12, 'Dec', 'Unk')
FROM orders;
-- DB2 CASE(標準,可移植)
SELECT CASE MONTH(shipped_date)
WHEN 1 THEN 'Jan' WHEN 2 THEN 'Feb' WHEN 3 THEN 'Mar'
WHEN 4 THEN 'Apr' WHEN 5 THEN 'May' WHEN 6 THEN 'Jun'
WHEN 7 THEN 'Jul' WHEN 8 THEN 'Aug' WHEN 9 THEN 'Sep'
WHEN 10 THEN 'Oct' WHEN 11 THEN 'Nov' WHEN 12 THEN 'Dec'
ELSE 'Unk'
END
FROM orders;
-- Oracle
SELECT DECODE(t.organtypecode, 'D', t.parent, 'S', t.parent, t.id)
FROM a_organ t
WHERE t.parent = 35;
-- DB2
SELECT CASE x.organtypecode
WHEN 'D' THEN x.parent
WHEN 'S' THEN x.parent
ELSE x.id
END
FROM a_organ x
WHERE x.parent = 35;
SELECT t.id
FROM a_organ t
START WITH t.id IN (
SELECT DECODE(t.organtypecode, 'D', t.parent, 'S', t.parent, t.id)
FROM a_organ WHERE t.id = 35
)
CONNECT BY t.parent = PRIOR t.id;
WITH RECURSIVE fkk(id) AS (
-- 錨點成員:根節點
SELECT o.id
FROM a_organ o
WHERE o.id = 35
UNION ALL
-- 遞歸成員:子節點關聯父節點
SELECT CASE x.organtypecode
WHEN 'D' THEN x.parent
WHEN 'S' THEN x.parent
ELSE x.id
END
FROM fkk fk
JOIN a_organ x ON fk.id = x.parent
)
SELECT DISTINCT id FROM fkk;
WITH RECURSIVE 關鍵字(DB2、PostgreSQL、SQL Server、MySQL 8.0+ 同樣支援)。UNION ALL 遞歸成員,遞歸成員引用 CTE 名稱 fkk。DISTINCT 去重(防止循環引用導致無限遞歸,DB2 默認最大遞歸深度 256,可通過 MAX RECURSION DEPTH 調整)。| Oracle | DB2 對應 | 備註 |
|---|---|---|
SYSDATE | CURRENT TIMESTAMP / CURRENT DATE | 時區處理不同 |
DUAL | SYSIBM.SYSDUMMY1 | 單行虛表 |
NVL(a,b) | COALESCE(a,b) / IFNULL(a,b) | 標準函數 |
TO_CHAR(date,'fmt') | VARCHAR_FORMAT(date,'fmt') | 格式字符串差異大,需逐項對照 |
ROWNUM | ROW_NUMBER() OVER() / FETCH FIRST n ROWS ONLY | 分頁邏輯不同 |
(+) 外連接 | LEFT/RIGHT/FULL OUTER JOIN | 標準語法 |
LISTAGG | LISTAGG (DB2 11.1+) | 字符串聚合 |
PIVOT/UNPIVOT | 不直接支援,用 CASE + 聚合模擬 | 行列轉換 |
DBMS_RANDOM | RAND() / GENERATE_UNIQUE() | 隨機數 |
Oracle → DB2 遷移的核心難點在於 DECODE → CASE 與 CONNECT BY → WITH RECURSIVE 兩大專有語法的標準化轉換。掌握 CASE 兩種形式、WITH RECURSIVE 錨點/遞歸結構、COALESCE/FETCH FIRST/OUTER JOIN 等標準替代方案,配合系統化驗證清單,即可將遷移風險降至最低。建議建立 SQL_DIALECT_MAP 對照表,納入團隊知識庫,新開發直接編寫標準 SQL,從源頭消除遷移成本。