Oracle 內建單行函數涵蓋字串操作、數學運算、日期處理、型別轉換、條件判斷等核心能力。本文整理 30+ 高頻函數語法、參數、回傳值與實戰範例,作為開發速查手冊。
一、字串函數
| 函數 | 語法 | 範例 | 結果 |
| ASCII | ASCII(char) | ASCII('A') | 65 |
| CHR | CHR(n) | CHR(65) | 'A' |
| CONCAT | CONCAT(s1,s2) | CONCAT('AB','CD') | 'ABCD' |
| INITCAP | INITCAP(str) | INITCAP('hello world') | 'Hello World' |
| INSTR | INSTR(str, substr [,pos[,occ]]) | INSTR('oracle','a',1,2) | 0(第二個 a 不存在) |
| LENGTH | LENGTH(str) | LENGTH('中文') | 2(字元數) |
| LOWER/UPPER | LOWER(str)/UPPER(str) | UPPER('AbC') | 'ABC' |
| LPAD/RPAD | LPAD(str,n,pad)/RPAD(str,n,pad) | LPAD('7',5,'0') | '00007' |
| LTRIM/RTRIM/TRIM | TRIM([LEADING|TRAILING|BOTH] c FROM str) | TRIM(' abc ') | 'abc' |
| SUBSTR | SUBSTR(str,pos[,len]) | SUBSTR('123456',3,2) | '34' |
| REPLACE | REPLACE(str,old,new) | REPLACE('jack','j','J') | 'Jack' |
| SOUNDEX | SOUNDEX(str) | SOUNDEX('SMITH') | 'S530'(發音相似編碼) |
二、數值函數
| 函數 | 語法 | 範例 | 結果 |
| ABS | ABS(n) | ABS(-100) | 100 |
| CEIL/FLOOR | CEIL(n)/FLOOR(n) | CEIL(3.14) | 4 |
| ROUND/TRUNC | ROUND(n[,d])/TRUNC(n[,d]) | ROUND(3.14159,2) | 3.14 |
| MOD | MOD(m,n) | MOD(10,3) | 1 |
| POWER | POWER(m,n) | POWER(2,10) | 1024 |
| SQRT | SQRT(n) | SQRT(2) | 1.414... |
| SIN/COS/TAN | SIN(rad)等 | SIN(3.14159/2) | 1 |
| ASIN/ACOS/ATAN | 反三角函數 | ACOS(-1) | 3.14159 (π) |
| EXP/LN/LOG | 指數/自然對數/對數 | LN(2.71828) | 1 |
| SIGN | SIGN(n) | SIGN(-5) | -1 |
三、日期函數(補充 94552 文章)
| 函數 | 語法 | 關鍵行為 |
| ADD_MONTHS | ADD_MONTHS(d,n) | 月份加減,自動處理月底邊界 |
| LAST_DAY | LAST_DAY(d) | 該月最後一天 |
| MONTHS_BETWEEN | MONTHS_BETWEEN(d1,d2) | 月差,同日期/月底→整數 |
| NEXT_DAY | NEXT_DAY(d,weekday) | 下一個指定週幾 |
| ROUND/TRUNC | ROUND(d[,fmt])/TRUNC(d[,fmt]) | fmt: CC/YYYY/Q/MM/W/D/DAY/HH/MI |
| SYSDATE/SYSTIMESTAMP | 無參數 | 伺服器/會話當前時間 |
| NEW_TIME | NEW_TIME(d,z1,z2) | 已棄用,用 AT TIME ZONE |
四、轉換函數
| 函數 | 語法 | 範例 |
| TO_CHAR | TO_CHAR(n|d [,fmt [,nls]]) | TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') |
| TO_NUMBER | TO_NUMBER(str [,fmt [,nls]]) | TO_NUMBER('$1,234.56','$9,999.99') |
| TO_DATE | TO_DATE(str [,fmt [,nls]]) | TO_DATE('2024-01-15','YYYY-MM-DD') |
| CAST | CAST(expr AS type) | CAST('123' AS NUMBER) |
| HEXTORAW/RAWTOHEX | 16進位<->RAW | HEXTORAW('4142') |
五、通用/條件函數
| 函數 | 語法 | 說明 |
| NVL | NVL(expr1, expr2) | expr1 為 NULL 回傳 expr2 |
| NVL2 | NVL2(expr1, expr2, expr3) | expr1 不為 NULL 回傳 expr2,否則 expr3 |
| COALESCE | COALESCE(expr1, expr2, ...) | 回傳第一個非 NULL 參數(ANSI 標準) |
| NULLIF | NULLIF(expr1, expr2) | 兩值相等回傳 NULL,否則 expr1 |
| DECODE | DECODE(expr, search, result [,search,result]... [,default]) | Oracle 專有 CASE 簡寫 |
| CASE | CASE expr WHEN v1 THEN r1 ... ELSE rn END | ANSI 標準,支援搜尋條件 CASE WHEN cond THEN ... |
| GREATEST/LEAST | GREATEST(expr1,expr2...) | 回傳最大/最小值(忽略 NULL) |
| VSIZE | VSIZE(expr) | 內部表示位元組數 |
| DUMP | DUMP(expr [,fmt [,start [,len]]]) | 資料型別、長度、內部碼診斷用 |
實戰組合範例
-- 格式化身分證字號:A123456789 -> A123-456-789
SELECT REGEXP_REPLACE(id, '^(.{1})(.{3})(.{3})(.{3})$', '\1-\2-\3-\4') FROM id_table;
-- 計算年齡(精確到日)
SELECT FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE), birth_date)/12) AS age FROM employees;
-- 動態排序
SELECT * FROM products
ORDER BY CASE :sort_col WHEN 'PRICE' THEN price WHEN 'NAME' THEN name END;
收藏此手冊,單行函數組合拳解決 90% 資料清洗、格式化、業務計算需求。