本文整理 Oracle 資料庫開發中最常用的 SQL 函式,分類收錄字串處理、數學運算、日期時間、型別轉換、空值處理與群組彙總,附帶實用範例,方便查閱。
| 函式 | 說明 | 範例 |
|---|---|---|
| INITCAP(str) | 首字母大寫 | SELECT INITCAP('ni hao') FROM dual; → Ni Hao |
| LTRIM(str, chars) | 移除左側指定字元 | SELECT LTRIM('ni hao ni', 'ni') FROM dual; → hao ni |
| RTRIM(str, chars) | 移除右側指定字元 | SELECT RTRIM('hao ni hao', 'hao') FROM dual; → hao ni |
| CONCAT(s1, s2) / \|\| | 字串串接 | SELECT stuNo || ' ' || name FROM student; |
| SUBSTR(str, pos, len) | 擷取子字串(位置從 1 起) | SELECT SUBSTR('nihao hi hello', 1, 10) FROM dual; |
| INSTR(str, substr) | 搜尋子字串位置 | SELECT INSTR('nihao', 'ni') FROM dual; → 1 |
| LENGTH(str) | 字串長度 | SELECT LENGTH(address) FROM student; |
| RPAD(str, n, pad) | 右側填充至指定長度 | INSERT INTO school VALUES(RPAD(88,8,'0'), '南京大學'); |
| LPAD(str, n, pad) | 左側填充(常用流水號) | INSERT INTO school VALUES('S'||LPAD(89,7,'0'), '江蘇科技大學'); |
| LOWER/UPPER | 大小寫轉換 | WHERE UPPER(email) = UPPER('Bob.wang') 不分大小寫比對 |
| 函式 | 說明 | 範例 |
|---|---|---|
| ABS(n) | 絕對值 | SELECT ABS(-10) FROM dual; → 10 |
| CEIL(n) | 無條件進位 | SELECT CEIL(-10.1) FROM dual; → -10 |
| FLOOR(n) | 無條件捨去 | SELECT FLOOR(-10.1) FROM dual; → -11 |
| POWER(m, n) | 冪運算 | SELECT POWER(10,4) FROM dual; → 10000 |
| MOD(m, n) | 取餘數 | SELECT MOD(-10,3) FROM dual; → -1 |
| SQRT(n) | 平方根 | SELECT SQRT(100) FROM dual; → 10 |
| TRUNC(n, d) | 截取小數位(不四捨五入) | SELECT TRUNC(19.99281,3) FROM dual; → 19.992 |
| ROUND(n, d) | 四捨五入 | SELECT ROUND(19.99281,3) FROM dual; → 19.993 |
| 函式 | 說明 | 範例 |
|---|---|---|
| SYSDATE | 目前系統日期時間 | SELECT SYSDATE FROM dual; |
| ADD_MONTHS(d, n) | 日期加減月份 | SELECT ADD_MONTHS('25-11月-14', 2) FROM dual; |
| LAST_DAY(d) | 該月最後一天 | SELECT LAST_DAY(SYSDATE) FROM dual; |
| MONTHS_BETWEEN(d1, d2) | 兩日期月份差 | SELECT MONTHS_BETWEEN('25-11月-14', SYSDATE) FROM dual; |
| NEXT_DAY(d, n) | 下一個指定週幾(1=週日) | SELECT NEXT_DAY(SYSDATE, 6) FROM dual; → 下週五 |
| ROUND(d, 'MONTH') | 日期四捨五入(月中分界) | SELECT ROUND(SYSDATE, 'MONTH') FROM dual; |
| TRUNC(d, 'YEAR') | 截取至年/月/日 | SELECT TRUNC(SYSDATE, 'YEAR') FROM dual; → 該年 1/1 |
| GREATEST/LEAST | 多值最大/最小 | SELECT GREATEST(d1, d2, d3) FROM dual; 任一為 NULL 則回 NULL |
| 函式 | 說明 | 範例 |
|---|---|---|
| TO_DATE(str, fmt) | 字串轉日期 | TO_DATE('1995-10-10','YYYY-MM-DD') |
| TO_CHAR(d, fmt) | 日期轉字串 | TO_CHAR(birthDate,'YYYY-MM-DD') |
| TO_NUMBER(str) | 字串轉數值 | SELECT TO_NUMBER(schoolCode) FROM school; |
| NVL(expr1, expr2) | NULL 替換(Oracle 專用) | SELECT NVL(javaSEScore, 60) FROM student; |
| COALESCE(e1, e2,...) | 回傳第一個非 NULL | SELECT COALESCE('', '', '1', 'value') FROM dual; → '1' |
| 函式 | 說明 | 範例 |
|---|---|---|
| COUNT(*)/COUNT(col) | 筆數統計(忽略 NULL) | SELECT COUNT(*) FROM student; |
| SUM(col) | 加總 | SELECT SUM(javaSEScore) FROM student; |
| AVG(col) | 平均 | SELECT AVG(javaSEScore) FROM student; |
| MAX/MIN(col) | 最大/最小值 | SELECT MAX(javaSEScore) FROM student; |
| STDDEV(col) | 標準差 | SELECT STDDEV(javaSEScore) FROM student; |
| VARIANCE(col) | 變異數 | SELECT VARIANCE(javaSEScore) FROM student; |
dual 為 Oracle 虛擬表,單行測試常用YYYY-MM-DD vs yyyy-mm-ddNVL 為 Oracle 專屬,跨資料庫請用 COALESCE 或 CASEGROUP BY 使用時,SELECT 清單欄位需包含於 GROUP BY 或為彙總函式