Oracle 提供豐富的內建函數涵蓋字串、數值、日期、轉換、彙總、分析/視窗等類別。本文將 110+ 常用函數依功能分類整理,附帶語法、範例與實務提示,適合開發者與 DBA 快速查閱。 (原文函數編號 100-110 為重複,已去重合併。)
| 函數 | 說明 | 範例 | 結果 |
|---|---|---|---|
| ASCII(c) | 回傳字元的 ASCII/Unicode 碼點 | ASCII('A') | 65 |
| CHR(n) | 回傳碼點對應字元 | CHR(65) | 'A' |
| CONCAT(s1,s2) / s1||s2 | 字串串聯 | CONCAT('AB','CD') | 'ABCD' |
| INITCAP(s) | 首字大寫,其餘小寫 | INITCAP('hello world') | 'Hello World' |
| INSTR(s, sub, pos, occ) | 搜尋子字串位置 (支援起始位置、第 N 次出現) | INSTR('Oracle Training','ra',1,2) | 9 |
| LENGTH(s) / LENGTHB(s) | 字元長度 / 位元組長度 | LENGTH('中文') | 2 |
| LOWER(s) / UPPER(s) | 大小寫轉換 | UPPER('abc') | 'ABC' |
| LPAD(s, n, pad) / RPAD(s, n, pad) | 左/右填充至指定長度 | LPAD('GAO',10,'*') | '*******GAO' |
| LTRIM(s, chars) / RTRIM(s, chars) | 移除左/右側指定字元 (預設空白) | LTRIM(' GAO') | 'GAO' |
| SUBSTR(s, pos, len) / SUBSTRB | 擷取子字串 (位元組語意) | SUBSTR('13088888888',3,8) | '08888888' |
| REPLACE(s, old, new) | 字串替換 | REPLACE('he love you','he','I') | 'I love you' |
| SOUNDEX(s) | 回傳發音代碼 (英文姓名模糊比對) | SOUNDEX('Smith') | 'S530' |
| TRIM([LEADING|TRAILING|BOTH] c FROM s) | 標準 SQL 去除首尾字元 | TRIM(' ' FROM ' AB ') | 'AB' |
| TRANSLATE(s, from, to) | 字元級對應替換 (一對一) | TRANSLATE('abc','abc','123') | '123' |
| 函數 | 說明 | 範例 | 結果 |
|---|---|---|---|
| ABS(n) | 絕對值 | ABS(-100) | 100 |
| ACOS/ASIN/ATAN(n) | 反三角函數 (弧度) | ACOS(-1) | 3.14159... |
| CEIL(n) / FLOOR(n) | 天花板/地板 (無條件進位/捨去) | CEIL(3.14) | 4 |
| COS/SIN/TAN(n) | 三角函數 (弧度) | COS(3.14159) | -1 |
| COSH/SINH/TANH(n) | 雙曲線函數 | COSH(1) | 1.543 |
| EXP(n) | e 的 n 次方 | EXP(1) | 2.71828 |
| LN(n) / LOG(b, n) | 自然對數 / 指定底對數 | LOG(2,8) | 3 |
| MOD(m, n) | 餘數 (m - n*FLOOR(m/n)) | MOD(10,3) | 1 |
| POWER(m, n) | m 的 n 次方 | POWER(2,10) | 1024 |
| ROUND(n, dec) / TRUNC(n, dec) | 四捨五入 / 截斷 (dec 可負數) | ROUND(55.5), TRUNC(55.5) | 56, 55 |
| SIGN(n) | 正負號 (1, -1, 0) | SIGN(-5) | -1 |
| SQRT(n) | 平方根 | SQRT(64) | 8 |
| WIDTH_BUCKET(val, min, max, buckets) | 等寬分桶編號 (1~buckets) | WIDTH_BUCKET(75,0,100,10) | 8 |
| 函數 | 說明 | 範例 | 結果 |
|---|---|---|---|
| SYSDATE / SYSTIMESTAMP | 資料庫伺服器當前日期/時間戳 | SYSDATE | 2024-05-20 14:30:00 |
| CURRENT_DATE / CURRENT_TIMESTAMP | Session 時區當前日期/時間戳 | CURRENT_TIMESTAMP | 2024-05-20 14:30:00.123 +08:00 |
| ADD_MONTHS(d, n) | 加減月份 (自動處理月末) | ADD_MONTHS(DATE'2024-01-31',1) | 2024-02-29 |
| LAST_DAY(d) | 該月最後一天 | LAST_DAY(SYSDATE) | 2024-05-31 |
| MONTHS_BETWEEN(d1, d2) | 兩日期月份差 (含小數) | MONTHS_BETWEEN(DATE'2024-12-31',DATE'2024-01-01') | 11.97 |
| NEXT_DAY(d, '星期X') | 指定星期之後的下一個日期 | NEXT_DAY(SYSDATE,'FRIDAY') | 2024-05-24 |
| NEW_TIME(d, tz1, tz2) | 時區轉換 (舊函數,建議用 FROM_TZ/AT TIME ZONE) | NEW_TIME(SYSDATE,'PST','EST') | ... |
| ROUND(d, fmt) / TRUNC(d, fmt) | 日期捨入/截斷 (fmt: YEAR, MONTH, DAY, HH, MI...) | TRUNC(SYSDATE,'MONTH') | 2024-05-01 00:00:00 |
| EXTRACT(field FROM d) | 擷取日期欄位 (YEAR, MONTH, DAY, HOUR...) | EXTRACT(MONTH FROM SYSDATE) | 5 |
| TO_CHAR(d, fmt) / TO_DATE(s, fmt) | 日期↔字串轉換 (格式模板) | TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') | '2024-05-20 14:30:00' |
| TO_TIMESTAMP / TO_TIMESTAMP_TZ | 字串轉 Timestamp / Timestamp with TZ | TO_TIMESTAMP('2024-05-20 14:30','YYYY-MM-DD HH24:MI') | ... |
| INTERVAL 'n' UNIT | 間隔常值 (支援運算) | SYSDATE + INTERVAL '7' DAY | 一週後 |
| 函數 | 說明 | 範例 |
|---|---|---|
| TO_NUMBER(s, fmt) | 字串轉數值 | TO_NUMBER('$1,234.56','$9,999.99') |
| TO_CHAR(n, fmt) | 數值轉格式化字串 | TO_CHAR(1234.5,'FM$9,999.00') |
| NVL(expr1, expr2) | expr1 為 NULL 回傳 expr2 | NVL(comm, 0) |
| NVL2(expr1, expr2, expr3) | expr1 不為 NULL 回傳 expr2,否則 expr3 | NVL2(comm, '有獎金', '無獎金') |
| NULLIF(expr1, expr2) | 相等回傳 NULL,否則 expr1 | NULLIF(len, 0) |
| COALESCE(e1, e2, ...) | 回傳第一個非 NULL 參數 (ANSI 標準) | COALESCE(comm, sal, 0) |
| CASE WHEN ... THEN ... ELSE ... END | 標準條件表達式 (可嵌套) | CASE WHEN sal>5000 THEN '高' ELSE '普' END |
| DECODE(expr, s1, r1, s2, r2, ..., def) | Oracle 專用條件 (等值比較) | DECODE(deptno,10,'A',20,'B','其他') |
AVG, SUM, COUNT, MAX, MIN - 基礎彙總STDDEV, STDDEV_POP, STDDEV_SAMP - 標準差 (總體/樣本)VARIANCE, VAR_POP, VAR_SAMP - 變異數MEDIAN - 中位數 (10g+)STATS_MODE - 眾數 (10g+)GROUPING / GROUPING_ID - 識別 GROUP BY ROLLUP/CUBE 產生的彙總列LISTAGG(expr, delimiter) WITHIN GROUP (ORDER BY ...) - 字串彙總 (11g+),如 `LISTAGG(ename,',') WITHIN GROUP (ORDER BY ename)` → `'ALLEN,BLAKE,CLARK...'`語法:FUNCTION(...) OVER (PARTITION BY ... ORDER BY ... [WINDOWING_CLAUSE])。
不減少回傳列數,每列都可見群組內彙總/排序結果。
| 函數 | 說明 | 關鍵特性 |
|---|---|---|
| ROW_NUMBER() | 分組內唯一遞增序號 (1,2,3...) | 無並列,可用於分頁、去重 |
| RANK() | 排名,並列同名次,後續跳號 (1,2,2,4) | 適合排名報表 |
| DENSE_RANK() | 密集排名,並列同名次,不跳號 (1,2,2,3) | 適合連續等級 |
| LAG(expr, offset, def) | 取得前一列 (或指定偏移) 的值 | 避免 Self-Join,計算環比 |
| LEAD(expr, offset, def) | 取得後一列的值 | 計算同比、預測 |
| FIRST_VALUE(expr) | 視窗內第一列的值 | 基準比較 |
| LAST_VALUE(expr) | 視窗內最後一列的值 (需加窗口子句) | 結尾基準 |
| NTILE(n) | 分組資料等分為 n 個桶,回傳桶號 | 四分位數、十分位數 |
| CUME_DIST() | 累積分布 (≤ 當前值的比例) | 0<值≤1 |
| PERCENT_RANK() | 相對排名 (排名-1)/(總數-1) | 0~1 之間 |
| PERCENTILE_CONT(p) | 連續百分位數 (插值計算) | 中位數 p=0.5 |
| PERCENTILE_DISC(p) | 離散百分位數 (取實際資料值) | 實際存在的值 |
| AVG/SUM/MAX/MIN/COUNT OVER (...) | 視窗彙總 (移動平均、累加和...) | ROWS/RANGE 子句控制視窗範圍 |
| CORR/COVAR_POP/COVAR_SAMP OVER (...) | 視窗相關係數/協方差 | 統計分析 |
| REGR_SLOPE/INTERCEPT/COUNT/R2/AVGX/AVGY/SXX/SYY/SXY OVER (...) | 線性回歸統計視窗函數 | 趨勢分析 |
| STDDEV_POP/SAMP, VAR_POP/SAMP OVER (...) | 視窗標準差/變異數 | 波動度監控 |
OVER (
PARTITION BY deptno -- 分組
ORDER BY sal -- 排序 (決定視窗起訖)
ROWS BETWEEN 3 PRECEDING AND CURRENT ROW -- 實體列數視窗
RANGE BETWEEN 100 PRECEDING AND 100 FOLLOWING -- 數值範圍視窗
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING -- 全分組
)
SELECT deptno, ename, sal,
AVG(sal) OVER (PARTITION BY deptno ORDER BY hiredate
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS mov_avg_3,
LAG(sal) OVER (PARTITION BY deptno ORDER BY hiredate) AS prev_sal,
sal - LAG(sal) OVER (PARTITION BY deptno ORDER BY hiredate) AS diff_prev
FROM emp;
USER / UID - 當前用戶名/IDUSERENV('SESSIONID'/'LANGUAGE'/'TERMINAL'/'ISDBA'...) - 會話環境資訊 (12c+ 建議用 `SYS_CONTEXT('USERENV',...)`)DUMP(expr, fmt, start, len) - 內部儲存結構診斷EMPTY_BLOB() / EMPTY_CLOB() - LOB 初始化BFILENAME(dir, file) - 外部二進位檔案定位器HEXTORAW / RAWTOHEX - 十六進位↔原始二進位CHARTOROWID / ROWIDTOCHAR - ROWID 轉換GREATEST / LEAST - 多參數最大/最小值 (字串比較依編碼)VSIZE(expr) - 內部儲存位元組數