SQL Server (T-SQL) 與 Oracle (PL/SQL) 函數命名、參數順序、回傳型別常不同。本文整理數學、字串、日期、轉換、比較等高頻函數對照,附帶範例,供遷移開發、雙平台維護快速查閱。
| 功能 | SQL Server | Oracle | 備註 |
| 集合最大值 | MAX(val) FROM (VALUES...) | GREATEST(1, -2, 4, 3) | Oracle 多參數直接比較 |
| 集合最小值 | MIN(val) FROM (VALUES...) | LEAST(1, -2, 4, 3) | |
| NULL 替換 | ISNULL(col, 'def') | NVL(col, 'def') | Oracle 12c+ 有 COALESCE (標準) |
| 字元 ASCII 碼 | ASCII('a') | ASCII('a') | 同名 |
| ASCII 碼轉字元 | CHAR(97) | CHR(97) | |
| 字串串接 | '11' + '22' + '33' | '11' || '22' || '33' 或 CONCAT('11','22') | Oracle 用 || 或 CONCAT (僅 2 參數) |
| 子串位置 | CHARINDEX('s', 'sdsq', 2) | INSTR('sdsq', 's', 2) | 參數順序不同 |
| 模糊/模式位置 | PATINDEX('%d%q%', 'sdsfasdqe') | REGEXP_INSTR(str, 'd.*q') (10g+) | Oracle 用正則 |
| 子串擷取 | SUBSTRING('abcd', 2, 2) | SUBSTR('abcd', 2, 2) | 同功能,名稱異 |
| 子串替換 (指定長度) | STUFF('abcdef', 2, 3, 'ijklmn') | REPLACE('abcdef', 'bcd', 'ijklmn') | 邏輯不同:STUFF 依位置/長度,REPLACE 依內容 |
| 全域替換 | REPLACE(str, old, new) | REPLACE(str, old, new) | 同名同義 |
| 字元轉換 (逐字元) | 無直接對應 | TRANSLATE('fasdbfasegas', 'fa', '我') | Oracle 強大 TRANSLATE |
| 長度 | LEN / DATALENGTH | LENGTH / LENGTHB | LENGTHB 計算位元組 |
| 大小寫轉換 | LOWER / UPPER | LOWER / UPPER | 同名 |
| 首字母大寫 | 無內建 | INITCAP('abcd dsaf') | Oracle 獨有 |
| 左補字元 | SPACE(10) + 'abcd' | LPAD('abcd', 14) 或 LPAD('abcd', 14, '*') | |
| 右補字元 | 'abcd' + SPACE(10) | RPAD('abcd', 14) | |
| 去除空白 | LTRIM / RTRIM | LTRIM / RTRIM / TRIM | Oracle TRIM 可指定字元 |
| 重複字串 | REPLICATE('abcd', 2) | RPAD('abcd', 8, 'abcd') 或 PL/SQL 迴圈 | Oracle 無直接函數 |
| 發音相似 (Soundex) | SOUNDEX('Smith') | SOUNDEX('Smith') | 同名 |
| Soundex 差異比較 | DIFFERENCE('Smithers','Smythers') | UTL_MATCH.EDIT_DISTANCE_SIMILARITY (12c+) | |
| 功能 | SQL Server | Oracle | 備註 |
| 目前日期時間 | GETDATE() | SYSDATE (無秒) / SYSTIMESTAMP (含毫秒/時區) |
| 日期加減天數 | GETDATE() + 10 | SYSDATE + 10 | 同邏輯 |
| 格式化日期 | CONVERT(CHAR(10), GETDATE(), 120) | TO_CHAR(SYSDATE, 'YYYY-MM-DD') | Oracle 格式模型豐富 |
| 格式化時間 | CONVERT(CHAR(8), GETDATE(), 108) | TO_CHAR(SYSDATE, 'HH24:MI:SS') | |
| 擷取日期部分 | DATEPART/DATENAME(interval, dt) | TO_CHAR(dt, 'fmt') 或 EXTRACT(field FROM dt) (9i+) |
| 月末日期 | EOMONTH(dt) (2012+) | LAST_DAY(SYSDATE) | |
| 本週指定週日 | DATEADD(week, DATEDIFF(week, 0, dt), 0) 等 | NEXT_DAY(SYSDATE, 7) (7=週日) |
| 字串轉日期 | CAST('2004-09-08' AS DATETIME) | TO_DATE('2004-01-05 22:09:38', 'YYYY-MM-DD HH24:MI:SS') | Oracle 必須指定格式 |
| 兩日期差值 (秒) | DATEDIFF(SS, dt1, dt2) | (dt1 - dt2) * 86400 | Oracle 相減得天數 |
| 日期加減間隔 | DATEADD(MI, 8, GETDATE()) | SYSDATE + 8/1440 (分/1440) |
| 時區轉換 | SWITCHOFFSET / AT TIME ZONE (2016+) | NEW_TIME(dt, 'YDT', 'GMT') (舊) / FROM_TZ/AT TIME ZONE (9i+) |
函數對照是異構遷移的基礎工夫。建議團隊建立「函數映射規範文件」,配合自動化轉換工具 (如 SSMA、SQLines、自訂 Parser) 進行批次轉換,人工覆核高風險項目 (日期、NULL 處理、字串串接、型別轉換),即可大幅降低遷移錯誤率與工時。