Oracle DECODE 在 DB2 使用標準 SQL CASE 實現,支援兩種語法:
-- 搜尋型 CASE
CASE
WHEN 條件 THEN 結果1
ELSE 結果2
END
-- 簡單型 CASE
CASE 運算式1
WHEN 運算式2 THEN 結果1
ELSE 結果2
END
SELECT ORDNO, CUSNO,
CASE MONTH(SHIPDATE)
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'
END
FROM FILE;
| Oracle | DB2 |
|---|---|
SELECT DECODE(t.organtypecode, 'D', t.parent, 'S', t.parent, t.id) FROM A_ORGAN t WHERE t.parent = 35 |
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 |
Oracle 階層查詢在 DB2 使用 WITH RECURSIVE (或 WITH) 遞迴共用資料表運算式 (CTE):
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 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, A_ORGAN x
WHERE fk.id = x.parent
)
SELECT DISTINCT id FROM FKK;
-- Oracle
SELECT 15 AS ttt FROM DUAL;
-- DB2
SELECT 15 AS ttt FROM SYSIBM.SYSDUMMY1;
| 功能 | Oracle | DB2 |
|---|---|---|
| 字串轉日期 | TO_DATE(str, 'YYYY-MM-DD') | DATE('YYYY-MM-DD') 或 TIMESTAMP('YYYY-MM-DD') |
| 日期轉字串 | TO_CHAR(date, 'YYYY-MM-DD') | CHAR(date, ISO) 或 VARCHAR_FORMAT(date, 'YYYY-MM-DD') |
| 日期運算 | date + 1 | date + 1 DAY |
-- Oracle
WHERE m.blqsrq >= TO_DATE('2006-10-27','YYYY-MM-DD')
AND m.blqsrq < TO_DATE('2006-10-27','YYYY-MM-DD') + 1
-- DB2
WHERE DATE(m.blqsrq) >= DATE('2006-10-27')
AND DATE(m.blqsrq) < DATE('2006-10-27') + 1 DAY
COALESCE(expr1, expr2, ...):標準 SQL,回傳第一個非 NULL 引數,型別可異。VALUE(expr1, expr2):DB2 專用,要求兩引數型別相同。注意:Oracle NVL(num, '') 允許字串預設值,DB2 VALUE(num, '') 會報型別不符,需用 COALESCE(num, 0) 或 VALUE(num, 0)。
DB2 採 ANSI SQL-92 標準,無 Oracle (+) 符號:
| 類型 | Oracle | DB2 |
|---|---|---|
| 內連接 | FROM a, b WHERE a.id = b.id | FROM a INNER JOIN b ON a.id = b.id |
| 左外連接 | WHERE a.id = b.id(+) | FROM a LEFT OUTER JOIN b ON a.id = b.id |
| 右外連接 | WHERE a.id(+) = b.id | FROM a RIGHT OUTER JOIN b ON a.id = b.id |
| 全外連接 | 不支援單一查詢 | FROM a FULL OUTER JOIN b ON a.id = b.id |
DB2 LIKE 後僅接受:常數、特殊暫存器、主機變數、純量函數、上述運算式串接,**不支援直接欄位參考**。
| PK | Unique Idx | Normal Idx | No Index | |
|---|---|---|---|---|
| WITH RR | 鎖列 | 鎖列 | 不鎖列/不鎖表※ | 鎖列/鎖表 |
| WITH RS | 鎖列 | 鎖列 | 鎖列 | 鎖列/鎖表 |
※ 普通索引在 RR 下不鎖列不鎖表,原因涉及索引掃描範圍與幻讀防護機制,需進一步研究。
SELECT * FROM (
SELECT col1, col2, col3,
ROW_NUMBER() OVER(ORDER BY sort_col ASC) AS rn
FROM table_name
) AS t
WHERE t.rn BETWEEN 10 AND 20;
DECODE → CASEWITH RECURSIVEDUAL → SYSIBM.SYSDUMMY1NVL → COALESCE (注意型別)LIKE 後是否為欄位參考ROW_NUMBER() OVER()