跨平台開發/遷移時,函數語法差異是主要阻力點。本文整理數學、字符串、日期、轉換、空值、聚合六大類 50+ 高頻函數對照,採用「SQL Server 語法 → Oracle 語法」雙欄對比,可直接作為遷移速查手冊。
| 功能 | SQL Server | Oracle |
|---|---|---|
| 絕對值 | ABS(-1) | ABS(-1) FROM DUAL |
| 向上取整 | CEILING(-1.001) | CEIL(-1.001) FROM DUAL |
| 向下取整 | FLOOR(-1.001) | FLOOR(-1.001) FROM DUAL |
| 截取整數 | CAST(-1.002 AS INT) | TRUNC(-1.002) FROM DUAL |
| 四捨五入 | ROUND(1.23456, 4) | ROUND(1.23456, 4) FROM DUAL |
| e^x | EXP(1) | EXP(1) FROM DUAL |
| 自然對數 | LOG(2.718...) | LN(2.718...) FROM DUAL |
| 以 10 為底對數 | LOG10(10) | LOG(10,10) FROM DUAL |
| 平方 | SQUARE(4) | POWER(4,2) FROM DUAL |
| 平方根 | SQRT(4) | SQRT(4) FROM DUAL |
| 任意次冪 | POWER(3,4) | POWER(3,4) FROM DUAL |
| 隨機數 | RAND() | DBMS_RANDOM.VALUE(0,1) FROM DUAL |
| 符號 | SIGN(-8) | SIGN(-8) FROM DUAL |
| 圓周率 | PI() | 無內建 (自定義 ACOS(-1)) |
| 三角函數 | SIN/COS/TAN (弧度) | SIN/COS/TAN (弧度) FROM DUAL |
| 反三角 | ASIN/ACOS/ATAN/ATN2 | ASIN/ACOS/ATAN/ATAN2 FROM DUAL |
| 弧度↔角度 | DEGREES/RADIANS | 無內建 (自定義 *180/PI()) |
| 功能 | SQL Server | Oracle |
|---|---|---|
| 最大值 (標量列表) | MAX(v) FROM (VALUES...) | GREATEST(1,-2,4,3) FROM DUAL |
| 最小值 (標量列表) | MIN(v) FROM (VALUES...) | LEAST(1,-2,4,3) FROM DUAL |
| 功能 | SQL Server | Oracle |
|---|---|---|
| NULL 替換 | ISNULL(col, default) | NVL(col, default) / COALESCE(col, default) |
| 多參數首個非空 | COALESCE(a,b,c) | COALESCE(a,b,c) |
| 功能 | SQL Server | Oracle |
|---|---|---|
| 字符→ASCII | ASCII('a') | ASCII('a') FROM DUAL |
| ASCII→字符 | CHAR(97) | CHR(97) FROM DUAL |
| 連接 | '11'+'22'+'33' / CONCAT('11','22') | CONCAT('11','22') / '11'||'22'||'33' |
| 子串位置 | CHARINDEX('s','sdsq',2) | INSTR('sdsq','s',2) FROM DUAL |
| 模糊位置 | PATINDEX('%d%q%','sdsfasdqe') | REGEXP_INSTR(str, 'd.*q') (10g+) |
| 子串提取 | SUBSTRING('abcd',2,2) | SUBSTR('abcd',2,2) FROM DUAL |
| 子串替換 (指定位置/長度) | STUFF('abcdef',2,3,'ijklmn') | REPLACE('abcdef','bcd','ijklmn') (語義不同) |
| 全局替換 | REPLACE(str,old,new) | REPLACE(str,old,new) / TRANSLATE(str,'ab','cd') (字符級映射) |
| 長度 | LEN / DATALENGTH | LENGTH / LENGTHB |
| 大小寫 | LOWER / UPPER | LOWER / UPPER / INITCAP (首字母大寫) |
| 左填充 | SPACE(10)+'abcd' / RIGHT(REPLICATE(' ',10)+'abcd',14) | LPAD('abcd',14) FROM DUAL |
| 右填充 | 'abcd'+SPACE(10) | RPAD('abcd',14) FROM DUAL |
| 去空格 | LTRIM / RTRIM | LTRIM / RTRIM / TRIM |
| 重複字符 | REPLICATE('x',5) | RPAD('x',5,'x') / LPAD('x',5,'x') |
| 功能 | SQL Server | Oracle |
|---|---|---|
| 當前日期時間 | GETDATE() / SYSDATETIME() | SYSDATE / SYSTIMESTAMP / CURRENT_TIMESTAMP |
| 日期加減 | DATEADD(DAY, 10, GETDATE()) | SYSDATE + 10 / ADD_MONTHS(SYSDATE, 1) |
| 日期差 | DATEDIFF(DAY, d1, d2) | d2 - d1 (數值) / MONTHS_BETWEEN(d2,d1) |
| 日期部分提取 | YEAR/ MONTH/ DAY/ DATEPART | EXTRACT(YEAR FROM d) / TO_CHAR(d,'YYYY') |
| 日期構造 | DATEFROMPARTS(y,m,d) (2012+) | TO_DATE('2024-01-15','YYYY-MM-DD') |
| 格式化輸出 | FORMAT(d,'yyyy-MM-dd') (2012+) / CONVERT | TO_CHAR(d,'YYYY-MM-DD') |
| 字符串轉日期 | CAST/CONVERT/PARSE | TO_DATE(str,'fmt') / TO_TIMESTAMP |
| 月末日期 | EOMONTH(d) (2012+) | LAST_DAY(d) |
| 功能 | SQL Server | Oracle |
|---|---|---|
| 顯式轉換 | CAST(expr AS TYPE) / CONVERT(TYPE, expr, style) | CAST(expr AS TYPE) / TO_CHAR/TO_NUMBER/TO_DATE |
| 隱式轉換 | 較寬鬆 | 嚴格 (建議顯式轉換) |
DUAL:Oracle 單行查詢必須 FROM DUAL,SQL Server 可省略。ISNULL 只接受 2 參數,COALESCE 多參數通用,遷移統一用 COALESCE。+ 遇 NULL 結果為 NULL;Oracle || 遇 NULL 視為空串。遷移用 CONCAT 或 COALESCE 統一語義。DATEADD/DATEDIFF 粒度靈活;Oracle 直接數值加減 (天)、ADD_MONTHS (月)、INTERVAL (標準)。GETDATE() 非確定性函數,索引視圖/計算列不可用;Oracle SYSDATE 同理。收藏此表,遷移項目中遇到函數差異即查即用,大幅減少語法錯誤與語義偏差。