在異構資料庫遷移或混合環境開發中,DB2 與 Oracle 的函數差異常是開發人員面臨的首要挑戰。本文系統整理兩大資料庫在類型轉換、日期時間處理、字串操作及數學運算四大類核心函數的對應關係,並提供實戰範例,助您快速掌握跨平台 SQL 寫法差異。
DB2 與 Oracle 在資料型別轉換的函數命名與語法上存在顯著差異,以下為常用轉換場景對照:
| 目標類型 | Oracle 語法 | DB2 語法 |
|---|---|---|
| 數值轉字串 | TO_CHAR(15.5000) | CHAR(15.5000) |
| 字串轉日期 | TO_DATE('2008-01-01','YYYY-MM-DD') | DATE('2008-01-01') |
關鍵差異點:
TO_CHAR/TO_DATE 通用轉換函數,需指定格式遮罩CHAR/DATE/TIMESTAMP 等直接轉換函數,語法更簡潔SYSIBM.SYSDUMMY1 作為虛擬表DB2 內建轉換函數:
DECIMAL、DOUBLE、INTEGER、SMALLINT、REAL、HEXDATE、TIME、TIMESTAMPCHAR、VARCHAR日期時間處理是業務邏輯中最複雜的領域之一,兩大資料庫在函數設計哲學上截然不同。
| 功能 | Oracle | DB2 |
|---|---|---|
| 取得目前日期時間 | SYSDATE | CURRENT DATE / CURRENT TIMESTAMP |
| 日期加減運算 | SYSDATE + INTERVAL '1' DAY | CURRENT DATE + 1 DAY |
| 年/月/日/時/分/秒抽取 | EXTRACT(YEAR FROM date) | YEAR(date)、MONTH(date) 等獨立函數 |
DB2 提供豐富的日期屬性函數,Oracle 需組合多個函數才能達成:
DAYOFYEAR(date):該日期在當年的第幾天DAYOFWEEK(date):該日期在當週的第幾天DAYS(date):從 0001-01-01 起的總天數(利於日期差運算)MIDNIGHT_SECONDS(date):午夜至該時間的秒數MONTHNAME(date)、DAYNAME(date):回傳月份/星期名稱兩者皆支援:LENGTH、UPPER/UCASE、LOWER/LCASE、LTRIM、RTRIM、CONCAT、|| 串接運算子、SUBSTR。
-- Oracle
SELECT NVL(NULL, 'aaa') FROM dual;
-- DB2 (標準 SQL)
SELECT COALESCE(comm, 1000) FROM staff;
建議:優先使用 ANSI 標準的 COALESCE,可移植性更佳。
-- Oracle TRIM 功能強大,可指定導向與字元
SELECT TRIM(' abc ') FROM dual; -- 兩端
SELECT TRIM(LEADING ' ' FROM ' abc ') FROM dual; -- 左端
SELECT TRIM(TRAILING ' ' FROM ' abc ') FROM dual; -- 右端
-- DB2 需組合 LTRIM/RTRIM
SELECT LTRIM(RTRIM(' abc ')) FROM sysibm.sysdummy1; -- 兩端
SELECT LTRIM(' abc ') FROM sysibm.sysdummy1; -- 左端
SELECT RTRIM(' abc ') FROM sysibm.sysdummy1; -- 右端
INSERT(str, pos, len, newstr):在指定位置替換指定長度字串LOCATE(find, source[, start]):搜尋子字串位置(可指定起始位置)POSSTR(source, find):回傳子字串首次出現位置REPEAT(str, count):重複字串REPLACE(source, target, replacement):全域替換LEFT/RIGHT(str, len):取左/右指定長度SPACE(n):產生 n 個空白字元| 函數 | 說明 | 備註 |
|---|---|---|
ABS | 絕對值 | 雙支援 |
CEIL/CEILING | 無條件進位 | DB2 兩種名稱皆支援 |
FLOOR | 無條件捨去 | 雙支援 |
MOD(m, n) | 餘數(符號同被除數) | 雙支援 |
RAND() | 隨機數 0~1 | DB2 為 0~1,Oracle 需 DBMS_RANDOM.VALUE |
POWER(m, n) | m 的 n 次方 | 雙支援 |
ROUND(val, prec) | 四捨五入 | prec 為負時對小數點左側運算 |
TRUNCATE/TRUNC(val, prec) | 截斷 | DB2 用 TRUNCATE,Oracle 用 TRUNC |
SIGN | 正負號 -1/0/1 | 雙支援 |
COALESCE、CASE WHEN、EXTRACT 等 ANSI 標準語法掌握 DB2 與 Oracle 函數對應關係,是跨平台資料庫開發與遷移的基礎功夫。本文提供的對照表可作為日常開發的速查手冊,建議結合實際業務場景進行驗證測試,確保 SQL 行為一致性。