Oracle SQL 函数大全

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
XMLQUERYXQuery

详细见: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. 最佳实践

  1. 正确函数:场景
  2. 避免 WHERE 中函数:索引
  3. 函数索引:必要
  4. 正则:复杂
  5. 聚合:性能
  6. 分析:复杂统计
  7. 类型转换显式:避免隐式
  8. NULL 处理:NVL/COALESCE
  9. 测试:验证
  10. 文档:说明

17. 参考资料

[1] Oracle Database SQL Language Reference 19c, “Functions” https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Functions.html