Oracle 提供豐富的單列函數,掌握核心函數能讓 SQL 更簡潔、效能更高。本文按資料型別分類整理高頻函數,附參數說明、行為細節與實戰範例,適合開發、調優時速查參考。
| 函數 | 說明 | 範例/備註 |
|---|---|---|
ROUND(n[,m]) | 四捨五入,m 為小數位,負數向左捨入 | ROUND(23.56,1)=23.6、ROUND(23.56,-1)=20 |
TRUNC(n[,m]) | 截斷不捨入,參數同 ROUND | TRUNC(23.56,1)=23.5 |
MOD(n1,n2) | 餘數,n2=0 回傳 n1 | MOD(24,5)=4 |
CEIL/FLOOR | 向上/向下取整 | CEIL(-18.2)=-18、FLOOR(-2.2)=-3 |
POWER/SQRT/EXP/LN/LOG | 冪、平方根、指數、自然對數、對數 | POWER(2.2,2.2) |
SIGN/ABS | 正負號/絕對值 | SIGN(-14)=-1 |
BITAND | 位元 AND 運算 | BITAND(3,9)=1 (0011 & 1001 = 0001) |
| 三角函數群 | SIN/COS/TAN/ASIN/ACOS/ATAN/ATAN2/SINH/COSH/TANH | 參數為弧度,精度 30-38 位 |
| 函數 | 說明 | 關鍵行為 |
|---|---|---|
UPPER/LOWER/INITCAP | 大寫/小寫/首字母大寫 | 支援 CLOB/NCLOB |
LPAD/RPAD(str,n[,pad]) | 左/右填充至長度 n | n < len 截斷;pad 為 null 用空格 |
TRIM([LEADING/TRAILING/BOTH] c FROM str) | 修剪首尾字元 | 預設修剪空格;c 長度必為 1 |
LTRIM/RTRIM(str[,set]) | 移除左/右側包含於 set 的字元 | 非單字元修剪,LTRIM('WWh','Wh')='h' |
REPLACE(str,old[,new]) | 替換/刪除子串 | new 為 null 即刪除 |
TRANSLATE(str,from,to) | 字元級一對一映射替換 | TRANSLATE('abc','ab','12')='12c';長度必等 |
SUBSTR(str,pos[,len]) | 子串擷取 | pos=0 視為 1;pos<0 從右數 |
SOUNDEX | 發音編碼(英文) | 同音異拼比對利器 |
INSTR(str, substr[, pos[, occ]]):搜尋子串位置,pos 正負控制方向,occ 第 N 次出現。LENGTH/LENGTHB/LENGTHC:字元/位元/Unicode 字元長度。LENGTH('')=NULL(非 0)。ASCII/CHR:字元與碼值互轉。| 函數 | 說明 | 範例/陷阱 |
|---|---|---|
SYSDATE / CURRENT_DATE | 資料庫/Session 時區當前日期時間 | 極少數情況相差 1 秒(毫秒四捨五入) |
ADD_MONTHS(d,n) | 月份加減,自動處理月末 | ADD_MONTHS('2024-01-31',1)='2024-02-29' |
LAST_DAY(d) | 該月最後一天 | |
NEXT_DAY(d, weekday) | 下一個指定週幾 | weekday 需符合 Session 語言(中文『星期四』/英文『THURSDAY』) |
MONTHS_BETWEEN(d1,d2) | 月份差(可為小數) | 結果可正負 |
ROUND/TRUNC(date[,fmt]) | 日期四捨五入/截斷 | fmt='MM' 到月首、'YYYY' 到年首 |
EXTRACT(field FROM dt) | 提取年/月/日/時/分/秒 | field: YEAR/MONTH/DAY/HOUR/MINUTE/SECOND |
CURRENT_TIMESTAMP/LOCALTIMESTAMP/SYSTIMESTAMP | 含時區/毫秒精度的時間戳 | 精度參數 0-6 |
| 函數 | 用途 | 關鍵格式元素 |
|---|---|---|
TO_CHAR(n/d/timestamp [,fmt [,nls]]) | 數值/日期/時間戳 → 字串 | YYYY-MM-DD HH24:MI:SS、FM999G999D00、JSP (數字轉英文詞) |
TO_DATE(str[,fmt[,nls]]) | 字串 → 日期 | fmt='J' 為儒略日 (1-5373484) |
TO_NUMBER(str[,fmt[,nls]]) | 字串 → 數值 | 9G999D99 群組/小數分隔 |
CAST(expr AS type) | 跨型別轉換 | 支援 CHAR/NUMBER/DATE/ROWID 等互轉 |
TO_TIMESTAMP/TO_YMINTERVAL/TO_DSINTERVAL | 字串 → 間隔/時間戳型別 |
DECODE(expr, s1,r1, s2,r2,..., default)(IF-ELSE 鏈)、CASE WHEN ... THEN ... ELSE ... END(標準 SQL,更強大)。NVL(e1,e2)、NVL2(e1,e2,e3)、COALESCE(e1,e2,...)(回傳首個非空)、NULLIF(e1,e2)(相等回傳 NULL)。GREATEST/LEAST(list)。SYS_CONNECT_BY_PATH(col, sep) 僅用於 CONNECT BY 查詢。SYS_CONTEXT('USERENV', 'SESSION_USER/IP_ADDRESS/...') 獲取會話屬性。UID、USER、VSIZE(expr)(位元組長度)。EMPTY_BLOB()/EMPTY_CLOB()。NLS_CHARSET_NAME/ID/DECL_LEN、SYS_TYPEID。SYS_EXTRACT_UTC(ts) 轉 UTC、NEW_TIME(d, zone1, zone2) 時區轉換。TO_CHAR(number, 'FM999,999.00') 中 FM 移除前導空格,報表對齊關鍵。NEXT_DAY 週幾參數**必須匹配 NLS_DATE_LANGUAGE**,跨語言環境請用數字 1-7(1=Sunday)。TRUNC(date) 移除時間部分,常用於日期分組統計。CAST 效能優於 TO_* 系列。