Oracle SQL 函数大全
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai
文档版本:v1.0 / 2026-07
1. 概述
Oracle SQL 函数总览[1]:
详细见:Oracle SQL 函数大全。
2. 字符函数
2.1 字符处理
| 函数 |
说明 |
| UPPER(s) |
大写 |
| LOWER(s) |
小写 |
| INITCAP(s) |
首字母大写 |
| LENGTH(s) |
长度 |
| SUBSTR(s, m, n) |
子串 |
| INSTR(s, sub) |
位置 |
| REPLACE(s, a, b) |
替换 |
| TRANSLATE(s, a, b) |
翻译 |
| TRIM(s) |
去空格 |
| LTRIM(s) |
去左空格 |
| RTRIM(s) |
去右空格 |
| LPAD(s, n, c) |
左填充 |
| RPAD(s, n, c) |
右填充 |
| CONCAT(a, b) |
连接 |
| CHR(n) |
字符 |
| ASCII(s) |
ASCII |
2.2 示例
SELECT UPPER('smith'), LOWER('SMITH'), INITCAP('john smith') FROM dual;
SELECT SUBSTR('Hello World', 1, 5), INSTR('Hello', 'l') FROM dual;
SELECT REPLACE('abc', 'b', 'B'), TRANSLATE('abc', 'ab', 'AB') FROM dual;
SELECT LPAD('5', 5, '0'), RPAD('5', 5, '-') FROM dual;
3. 数值函数
3.1 数学
| 函数 |
说明 |
| ROUND(n, m) |
四舍五入 |
| TRUNC(n, m) |
截断 |
| MOD(a, b) |
模 |
| ABS(n) |
绝对值 |
| CEIL(n) |
上取整 |
| FLOOR(n) |
下取整 |
| POWER(a, b) |
幂 |
| SQRT(n) |
平方根 |
| EXP(n) |
e^n |
| LN(n) |
自然对数 |
| LOG(a, n) |
对数 |
| SIGN(n) |
符号 |
| GREATEST(…) |
最大 |
| LEAST(…) |
最小 |
3.2 三角
SELECT SIN(0), COS(0), TAN(0), ASIN(0), ACOS(0), ATAN(0) FROM dual;
3.3 示例
SELECT ROUND(3.14159, 2), TRUNC(3.14159, 2), MOD(10, 3) FROM dual;
SELECT CEIL(3.1), FLOOR(3.9), POWER(2, 10), SQRT(16) FROM dual;
4. 日期函数
4.1 日期
| 函数 |
说明 |
| SYSDATE |
当前日期 |
| SYSTIMESTAMP |
当前时间戳 |
| CURRENT_DATE |
会话日期 |
| CURRENT_TIMESTAMP |
会话时间戳 |
| ADD_MONTHS(d, n) |
加月 |
| MONTHS_BETWEEN(d1, d2) |
月差 |
| LAST_DAY(d) |
月末 |
| NEXT_DAY(d, day) |
下一个 |
| EXTRACT(field FROM d) |
提取 |
| TRUNC(d, fmt) |
截断 |
| ROUND(d, fmt) |
四舍五入 |
| TO_DATE(s, fmt) |
转换 |
| TO_CHAR(d, fmt) |
字符 |
| NUMTODSINTERVAL(n, unit) |
间隔 |
| NUMTOYMINTERVAL(n, unit) |
月间隔 |
4.2 示例
SELECT SYSDATE, SYSTIMESTAMP FROM dual;
SELECT ADD_MONTHS(DATE '2026-01-01', 6) FROM dual;
SELECT MONTHS_BETWEEN(DATE '2026-12-01', DATE '2026-01-01') FROM dual;
SELECT LAST_DAY(DATE '2026-07-21'), NEXT_DAY(DATE '2026-07-21', 'MONDAY') FROM dual;
SELECT EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE) FROM dual;
5. 转换函数
5.1 类型
| 函数 |
说明 |
| TO_CHAR(n, fmt) |
数字转字符 |
| TO_CHAR(d, fmt) |
日期转字符 |
| TO_DATE(s, fmt) |
字符转日期 |
| TO_NUMBER(s, fmt) |
字符转数字 |
| TO_TIMESTAMP(s, fmt) |
时间戳 |
| CAST(x AS type) |
类型转换 |
| CONVERT(s, d, s) |
字符集 |
| CHARTOROWID(s) |
ROWID |
| ROWIDTOCHAR(r) |
字符 |
5.2 示例
SELECT TO_CHAR(1234.56, '99,999.99') FROM dual;
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
SELECT TO_DATE('2026-07-21', 'YYYY-MM-DD') FROM dual;
SELECT TO_NUMBER('$1,234.56', '$9,999.99') FROM dual;
SELECT CAST(123 AS VARCHAR2(10)) FROM dual;
6. NULL 函数
| 函数 |
说明 |
| NVL(a, b) |
a NULL 返回 b |
| NVL2(a, b, c) |
a NULL 返回 c,否则 b |
| COALESCE(…) |
第一个非 NULL |
| NULLIF(a, b) |
相等返回 NULL |
| DECODE(…) |
条件 |
| LNNVL(cond) |
NULL 或 false 返回 true |
SELECT NVL(NULL, 0), NVL2(NULL, 1, 0) FROM dual;
SELECT COALESCE(NULL, NULL, 'a', 'b') FROM dual;
SELECT NULLIF(1, 1), NULLIF(1, 2) FROM dual;
SELECT DECODE(1, 1, 'one', 2, 'two', 'other') FROM dual;
7. 聚合函数
| 函数 |
说明 |
| COUNT(…) |
计数 |
| SUM(…) |
求和 |
| AVG(…) |
平均 |
| MAX(…) |
最大 |
| MIN(…) |
最小 |
| STDDEV(…) |
标准差 |
| VARIANCE(…) |
方差 |
| MEDIAN(…) |
中位数 |
| STATS_MODE(…) |
众数 |
| LISTAGG(…) |
字符串聚合 |
SELECT COUNT(*), SUM(salary), AVG(salary), MAX(salary), MIN(salary)
FROM employees;
SELECT dept_id, LISTAGG(name, ',') WITHIN GROUP (ORDER BY name)
FROM employees GROUP BY dept_id;
详细见:Oracle 高级分析函数。
8. 分析函数
8.1 排名
| 函数 |
说明 |
| ROW_NUMBER() |
行号 |
| RANK() |
排名(同并列,跳) |
| DENSE_RANK() |
排名(同并列,不跳) |
| NTILE(n) |
分组 |
| PERCENT_RANK() |
百分比排名 |
| CUME_DIST() |
累积分布 |
8.2 偏移
| 函数 |
说明 |
| LAG(…) |
之前 |
| LEAD(…) |
之后 |
| FIRST_VALUE(…) |
第一 |
| LAST_VALUE(…) |
最后 |
| NTH_VALUE(…) |
第 n |
8.3 窗口
| 函数 |
说明 |
| SUM(…) OVER |
累积 |
| AVG(…) OVER |
移动平均 |
| COUNT(…) OVER |
计数 |
| RATIO_TO_REPORT() |
比率 |
8.4 示例
SELECT name, salary,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rn,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rnk,
LAG(salary) OVER (PARTITION BY dept_id ORDER BY salary) AS prev_sal
FROM employees;
SELECT name, salary,
SUM(salary) OVER (PARTITION BY dept_id) AS dept_total,
RATIO_TO_REPORT(salary) OVER (PARTITION BY dept_id) AS pct
FROM employees;
详细见:Oracle 高级分析函数。
9. 字符串聚合
9.1 LISTAGG(11g+)
SELECT dept_id, LISTAGG(name, ',') WITHIN GROUP (ORDER BY name)
FROM employees
GROUP BY dept_id;
-- 12c+ DISTINCT
SELECT LISTAGG(DISTINCT name, ',') WITHIN GROUP (ORDER BY name) ...
9.2 XMLAgg
SELECT dept_id,
RTRIM(XMLAGG(XMLELEMENT(e, name || ',').EXTRACT('//text()')).GETSTRINGVAL(), ',')
FROM employees GROUP BY dept_id;
10. 正则
| 函数 |
说明 |
| REGEXP_LIKE(s, p) |
匹配 |
| REGEXP_SUBSTR(s, p) |
子串 |
| REGEXP_INSTR(s, p) |
位置 |
| REGEXP_REPLACE(s, p, r) |
替换 |
| REGEXP_COUNT(s, p) |
计数 |
SELECT * FROM employees WHERE REGEXP_LIKE(name, '^S.*h$');
SELECT REGEXP_SUBSTR('a1b2c3', '[0-9]+') FROM dual;
SELECT REGEXP_REPLACE('abc123', '[0-9]+', 'X') FROM dual;
详细见:Oracle 正则表达式详解。
11. 条件
11.1 CASE
-- 简单
SELECT name,
CASE dept_id
WHEN 10 THEN 'IT'
WHEN 20 THEN 'Sales'
ELSE 'Other'
END AS dept
FROM employees;
-- 搜索
SELECT name,
CASE
WHEN salary > 10000 THEN 'High'
WHEN salary > 5000 THEN 'Medium'
ELSE 'Low'
END AS level
FROM employees;
11.2 DECODE
SELECT name, DECODE(dept_id, 10, 'IT', 20, 'Sales', 'Other') FROM employees;
12. JSON 函数(12c+)
| 函数 |
说明 |
| JSON_VALUE |
标量 |
| JSON_QUERY |
片段 |
| JSON_EXISTS |
存在 |
| JSON_TABLE |
表 |
| JSON_OBJECT |
对象 |
| JSON_ARRAYAGG |
聚合 |
详细见:Oracle JSON 处理详解。
13. XML 函数
| 函数 |
说明 |
| XMLAGG |
聚合 |
| XMLELEMENT |
元素 |
| XMLFOREST |
多元素 |
| XMLATTRIBUTES |
属性 |
| XMLCONCAT |
连接 |
| XMLSERIALIZE |
序列化 |
| XMLTABLE |
表 |
| XMLQUERY |
XQuery |
详细见:Oracle XML 处理详解。
14. 其他
14.1 系统
| 函数 |
说明 |
| USER |
当前用户 |
| UID |
用户 ID |
| SYS_GUID() |
GUID |
| USERENV(s) |
会话信息 |
| SYS_CONTEXT(n, p) |
上下文 |
| DBMS_RANDOM |
随机 |
14.2 DUMP
SELECT DUMP('abc'), DUMP(123) FROM dual;
15. 自定义函数
CREATE OR REPLACE FUNCTION calc_bonus(p_salary NUMBER) RETURN NUMBER IS
BEGIN
RETURN p_salary * 0.1;
END;
/
详细见:Oracle 存储过程与函数详解。
16. 最佳实践
- 正确函数:场景
- 避免 WHERE 中函数:索引
- 函数索引:必要
- 正则:复杂
- 聚合:性能
- 分析:复杂统计
- 类型转换显式:避免隐式
- NULL 处理:NVL/COALESCE
- 测试:验证
- 文档:说明
17. 参考资料
[1] Oracle Database SQL Language Reference 19c, “Functions”
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Functions.html