為 SQL Server (T-SQL) 開發者轉型 Oracle (PL/SQL) 整理的 45+ 常用函數對照表,涵蓋數學、字串、日期、轉換、彙總、系統資訊等類別,附帶參數差異與呼叫範例。
數學函數
| 功能 | T-SQL | PL/SQL | 備註 |
| 絕對值 | ABS(-1) | ABS(-1) | 同 |
| 向上取整 | CEILING(-1.001) | CEIL(-1.001) | Oracle 縮寫 |
| 向下取整 | FLOOR(-1.001) | FLOOR(-1.001) | 同 |
| 截斷取整 | CAST(-1.002 AS INT) | TRUNC(-1.002) | Oracle 專有 |
| 四捨五入 | ROUND(1.23456,4) | ROUND(1.23456,4) | 同 |
| e^N | EXP(1) | EXP(1) | 同 |
| 自然對數 | LOG(2.718...) | LN(2.718...) | 名稱不同 |
| 以 10 為底對數 | LOG10(10) | LOG(10,10) | Oracle 通用 LOG(b,n) |
| 平方 | SQUARE(4) | POWER(4,2) | Oracle 通用 POWER |
| 平方根 | SQRT(4) | SQRT(4) | 同 |
| 任意次方 | POWER(3,4) | POWER(3,4) | 同 |
| 隨機數 | RAND() | DBMS_RANDOM.VALUE(0,1) | Oracle 需套件 |
| 正負號 | SIGN(-8) | SIGN(-8) | 同 |
| 圓周率 | PI() | 無內建,用 ACOS(-1) | |
| 三角函數 | SIN/COS/TAN (弧度) | SIN/COS/TAN (弧度) | 同 |
| 反三角函數 | ASIN/ACOS/ATAN/ATN2 | ASIN/ACOS/ATAN/ATAN2 | 同 |
| 角度弧度轉換 | DEGREES/RADIANS | 無內建,自寫 *180/PI() | |
字串函數
| 功能 | T-SQL | PL/SQL | 備註 |
| ASCII 碼 | ASCII('a') | ASCII('a') | 同 |
| 碼轉字元 | CHAR(97) | CHR(97) | 名稱不同 |
| 串接 | '11'+'22'+'33' | CONCAT('11','22')||'33' | Oracle 用 || 或 CONCAT(兩參數) |
| 子串位置 | CHARINDEX('s','sdsq',2) | INSTR('sdsq','s',2) | 參數順序相反 |
| 模糊模式位置 | PATINDEX('%d%q%','sdsfasdqe') | 無直譯,用 REGEXP_INSTR (10g+) | |
| 子串擷取 | SUBSTRING('abcd',2,2) | SUBSTR('abcd',2,2) | 同 |
| 子串替換 | STUFF('abcdef',2,3,'ijklmn') | REPLACE('abcdef','bcd','ijklmn') | 邏輯不同 |
| 字元級替換 | 無 | TRANSLATE('fasdbfasegas','fa','我') | Oracle 專有 |
| 長度 | LEN/DATALENGTH | LENGTH | |
| 大小寫 | LOWER/UPPER | LOWER/UPPER | 同 |
| 首字母大寫 | 無 | INITCAP('abcd dsaf') | Oracle 專有 |
| 左填充 | SPACE(10)+'abcd' | LPAD('abcd',14) | |
| 右填充 | 'abcd'+SPACE(10) | RPAD('abcd',14) | |
| 修剪空白 | LTRIM/RTRIM | LTRIM/RTRIM/TRIM | Oracle 多 TRIM |
| 重複字串 | REPLICATE('abcd',2) | 無直譯,用 RPAD 或遞迴 | |
| 發音比對 | SOUNDEX/DIFFERENCE | SOUNDEX | Oracle 無 DIFFERENCE |
日期函數
| 功能 | T-SQL | PL/SQL | 備註 |
| 系統時間 | GETDATE() | SYSDATE | Oracle 無毫秒,用 SYSTIMESTAMP |
| 前後幾日 | DATEADD(DAY,n,d) | d + n (直接加減數字) | Oracle 極簡 |
| 日期部分 | CONVERT(CHAR(10),d,20) | TRUNC(d) / TO_CHAR(d,'YYYY-MM-DD') | |
| 時間部分 | CONVERT(CHAR(8),d,108) | TO_CHAR(d,'HH24:MI:SS') | |
| 日期元件提取 | DATEPART/DATENAME | TO_CHAR(d,'fmt') | Oracle 統一用 TO_CHAR |
| 月底日期 | 無 (2012+ EOMONTH) | LAST_DAY(d) | |
| 下一星期幾 | 無 | NEXT_DAY(d,'FRIDAY') | |
| 時區轉換 | AT TIME ZONE (2016+) | NEW_TIME(d,'YDT','GMT') | Oracle 專有 |
| 字串轉日期 | CAST('2004-09-08' AS DATETIME) | TO_DATE('2004-01-05 22:09:38','YYYY-MM-DD HH24:MI:SS') | |
| 日期差(秒) | DATEDIFF(SS,d1,d2) | (d1-d2)*24*60*60 | Oracle 直接相減 |
| 日期加減 | DATEADD(MI,8,d) | d + 8/60/24 | Oracle 用分數天 |
轉換函數
| 方向 | T-SQL | PL/SQL |
| 數值→字串 | CONVERT/STR | TO_CHAR |
| 字串→數值 | CONVERT | TO_NUMBER |
| 日期→字串 | CONVERT | TO_CHAR |
| 字串→日期 | CONVERT | TO_DATE |
| 16進制↔二進制 | CONVERT | HEX_TO_RAW/RAW_TO_HEX |
其他單列函數
| 功能 | T-SQL | PL/SQL |
| 首個非 NULL | COALESCE | COALESCE / NVL / DECODE |
| 當前序列值 | 無 | CURRVAL |
| 下一序列值 | 無 | NEXTVAL |
| 相等回 NULL | NULLIF | NULLIF / DECODE |
| 登入用戶 ID | SUSER_ID | UID |
| 登入用戶名 | SUSER_NAME | USER |
| 資料庫用戶 ID | USER_ID | UID |
| 資料庫用戶名 | USER_NAME | USER |
| 當前用戶 | CURRENT_USER | CURRENT_USER |
| 用戶環境 | 無 | USERENV |
| 連接層級 | 無 | LEVEL (CONNECT BY) |
彙總函數
| 功能 | T-SQL | PL/SQL |
| 平均 | AVG | AVG |
| 計數 | COUNT | COUNT |
| 最大值 | MAX | MAX |
| 最小值 | MIN | MIN |
| 標準差 | STDEV/STDEVP | STDDEV |
| 加總 | SUM | SUM |
| 變異數 | VAR/VARP | VARIANCE |
Oracle 專有實用函數
-- EXTRACT 提取日期時間元件(ANSI 標準,Oracle 9i+ 支援)
SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual; -- 2024
SELECT EXTRACT(MONTH FROM SYSDATE) FROM dual; -- 1
SELECT EXTRACT(DAY FROM SYSDATE) FROM dual; -- 15
函數名稱差異是表象,**參數順序、預設格式、NULL 處理、隱式轉換規則** 才是遷移踩坑重點。建立專案級「函數對照表」並寫單元測試驗證,遷移才不會出現邏輯錯誤。