-- Oracle
SELECT DECODE(org_type, 'D', parent_id, 'S', parent_id, org_id) FROM a_organ;
-- DB2
SELECT CASE org_type
WHEN 'D' THEN parent_id
WHEN 'S' THEN parent_id
ELSE org_id
END
FROM a_organ;
-- Oracle
SELECT id FROM a_organ
START WITH id IN (SELECT DECODE(org_type,'D',parent_id,'S',parent_id,org_id) FROM a_organ WHERE id=35)
CONNECT BY PRIOR id = parent_id;
-- DB2
WITH RECURSIVE FKK(id) AS (
SELECT id FROM a_organ WHERE id=35
UNION ALL
SELECT CASE x.org_type
WHEN 'D' THEN x.parent_id
WHEN 'S' THEN x.parent_id
ELSE x.org_id
END
FROM FKK fk, a_organ x
WHERE fk.id = x.parent_id
)
SELECT DISTINCT id FROM FKK;
-- Oracle: SELECT 15 AS ttt FROM dual;
-- DB2: SELECT 15 AS ttt FROM SYSIBM.SYSDUMMY1;
-- Oracle: TO_DATE('2023-01-01','YYYY-MM-DD')
-- DB2: DATE('2023-01-01') 或 TIMESTAMP('2023-01-01')
-- 範圍查詢
-- Oracle: blqsrq >= TO_DATE(:p1,'YYYY-MM-DD') AND blqsrq < TO_DATE(:p2,'YYYY-MM-DD')+1
-- DB2: DATE(blqsrq) >= DATE(:p1) AND DATE(blqsrq) < DATE(:p2) + 1 DAY
-- Oracle: NVL(comm, 0)
-- DB2: COALESCE(comm, 0) -- 標準 SQL,參數型別需一致
-- DB2: VALUE(comm, 0) -- DB2 相容函數,同樣要求型別一致
注意:DB2 VALUE 兩參數型別必須相容,不如 Oracle NVL 寬鬆。
-- Oracle 右外聯結: WHERE a.dept_no = b.dept_no(+)
-- DB2: RIGHT OUTER JOIN b ON a.dept_no = b.dept_no
-- Oracle 左外聯結: WHERE a.dept_no(+) = b.dept_no
-- DB2: LEFT OUTER JOIN b ON a.dept_no = b.dept_no
-- 全外聯結: FULL OUTER JOIN
DB2 LIKE 右運算元不支援欄位參考,僅支援:常數、特殊暫存器、主機變數、標量函數、上述串接運算式。
Oracle 允許 WHERE col1 LIKE col2,DB2 需改寫為 WHERE col1 LIKE '%' || col2 || '%'(效能較差)或應用層處理。
| 索引類型 | RR (Repeatable Read) | RS (Read Stability) |
|---|---|---|
| Primary Key / Unique | 鎖行,不鎖表 | 鎖行,不鎖表 |
| Normal Index | 不鎖行,不鎖表* | 鎖行,不鎖表 |
| No Index (Table Scan) | 鎖行,鎖表 | 鎖行,鎖表 |
* RR 下普通索引掃描不鎖行(因非唯一鍵可能產生幻讀,但 DB2 優化選擇不鎖),RS 則鎖行。
-- DB2 標準分頁 (ROW_NUMBER)
SELECT * FROM (
SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY id ASC) AS rn
FROM my_table
) WHERE rn BETWEEN 10 AND 20;
SYSDATE → CURRENT TIMESTAMPTRUNC(date) → DATE(date)ROWNUM → ROW_NUMBER() OVER() 或 FETCH FIRST n ROWS ONLYINSTR → LOCATE / POSSTRSUBSTR 語法相同,參數順序一致