Oracle作为关系型数据库管理系统的代表,其内置函数体系是支撑复杂数据处理的核心工具。通过数千个预定义函数,开发者能够高效完成数据转换、计算、匹配等操作,显著降低SQL编码复杂度。这些函数覆盖字符串处理、数值运算、日期管理、类型转换等八大核心领域,既包含基础功能如SUBSTR和ROUND,也涵盖高级特性如REGEXP_REPLACE和LAG。值得注意的是,Oracle函数设计遵循声明式编程思想,单个函数常具备多参数形态(如TO_DATE支持字符串、时间戳等多种输入),且部分函数存在Oracle特有的扩展语法(如DECODE的嵌套逻辑)。掌握这些函数不仅需要理解语法结构,更需结合执行上下文分析性能差异,例如NVL与COALESCE在空值处理中的效率对比。
一、字符串处理函数
字符串函数用于文本解析、格式转换和内容清洗,是ETL处理的核心工具。
函数名 | 功能描述 | 典型参数 | 返回值示例 |
---|---|---|---|
SUBSTR(str, start, [length]) | 截取子字符串 | 'Oracle',2,3 → 'r' | 'r' |
INSTR(str, substr) | 查找子串位置 | 'abcabc','b' → 2 | 2 |
REPLACE(str, old, new) | 替换指定内容 | 'a-b-c','-','/' → 'a/b/c' | 'a/b/c' |
进阶场景可结合REGEXP_SUBSTR实现正则匹配,或通过TRIM清理空格。需注意字符集差异对LENGTH计算的影响。
二、数值计算函数
数值函数支持精确算术、舍入控制和数学运算,适用于财务计算和统计场景。
函数名 | 功能描述 | 关键参数 | 适用场景 |
---|---|---|---|
ROUND(n, [decimals]) | 四舍五入 | 123.456,2 → 123.46 | 金额保留两位小数 |
TRUNC(n, [decimals]) | 直接截断 | 123.456,2 → 123.45 | 库存数量取整 |
MOD(n, m) | 取模运算 | 10,3 → 1 | 周期性数据分组 |
对于大数值计算,建议使用NUMTODSINTERVAL转换时间单位,或通过CEIL/FLOOR实现向上/向下取整。
三、日期时间函数
日期函数提供时间戳操作、区间计算和格式转换能力,是时序数据处理的基础。
函数名 | 功能描述 | 参数示例 | 输出结果 |
---|---|---|---|
SYSDATE | 当前系统时间 | 无 | 2023-10-01 15:30:00 |
ADD_MONTHS(d, n) | 月份增减 | DATE'2023-01', 6 → '2023-07' | '2023-07-01' |
MONTHS_BETWEEN(d1, d2) | 月份差值 | '2023-03','2023-01' → 2 | 2 |
时间格式化依赖TO_CHAR(date, 'format'),而NEW_TIME可实现时区转换。需注意日期运算默认基于天数而非工作日。
四、类型转换函数
类型转换函数解决数据类型不匹配问题,是跨表关联和动态查询的关键。
函数名 | 转换方向 | 特殊处理 | 异常处理 |
---|---|---|---|
TO_DATE(str, format) | 字符串→日期 | '2023/10/01','yyyy/mm/dd' | 格式错误返回错误 |
TO_CHAR(val, format) | 任意→字符串 | 123.45,'999.99' → '123.45' | 四舍五入格式化 |
CAST(val AS type) | 显式类型转换 | '5' → INTEGER(5) | 转换失败报错 |
隐式转换易导致性能问题,建议优先使用TO_*系列函数。对于JSON数据处理,可结合JSON_VALUE和JSON_QUERY。
五、聚合统计函数
聚合函数用于分组统计,支持SUM/AVG/MAX等经典运算及扩展功能。
函数名 | 计算逻辑 | NULL处理 | 典型应用 |
---|---|---|---|
SUM(expr) | 求和 | 忽略NULL值 | 销售总额统计 |
AVG(expr) | 平均值 | 自动排除NULL | 用户评分均值 |
COUNT(*) | 计数 | 统计所有行 | 订单总量统计 |
复杂统计可使用COLLECT进行集合归并,或通过PERCENTILE_CONT计算百分位数。需注意聚合函数破坏查询排序规则。
六、逻辑判断函数
逻辑函数实现条件分支和空值处理,是业务规则编码的核心工具。
函数名 | 功能特性 | 语法示例 | 等效逻辑 |
---|---|---|---|
DECODE(expr, case1, res1, ...) | 多条件匹配 | DECODE(score,90,'A',80,'B') | IF-ELSE链替代 |
CASE WHEN condition THEN ... | 标准条件语句 | CASE WHEN age<18 THEN '未成年' | ANSI SQL标准写法 |
NVL(expr, default) | 空值替换 | NVL(comm,0) → 0当佣金为空 | 简化COALESCE单参数场景 |
对于多层嵌套条件,建议优先使用CASE语句提升可读性。在PL/SQL中可结合RETURNING优化性能。
七、分组排序函数
分组函数支持多维数据统计,窗口函数实现行列间计算。
函数类别 | 代表函数 | 作用范围 | 执行顺序 |
---|---|---|---|
GROUP BY扩展 | CUBE, ROLLUP | 多维度聚合 | 先于SELECT执行 |
窗口函数 | RANK(), LAG() | 分区内计算 | 后于FROM执行 |
分析函数 | NTILE, RATIO_TO_REPORT | 分布统计 | 独立于GROUP BY |
PARTITION BY定义数据分区,ORDER BY控制排序顺序。例如LAG(salary,1) OVER (PARTITION BY dept)可获取部门内前一行薪资。
八、正则表达式与JSON函数(扩展)
现代数据库支持正则匹配和JSON解析,适应非结构化数据处理需求。
函数类别 | Oracle实现 | MySQL等价 | 适用场景 |
---|---|---|---|
正则替换 | REGEXP_REPLACE(str, pattern, replacement) | REGEXP_REPLACE(str, pat, rep) | 日志清洗、路径提取 |
JSON解析 | JSON_VALUE(doc, '$.key'), JSON_QUERY(doc, '$') | JSON_EXTRACT(doc, '$.key') | 半结构化数据存储 |
XML处理 | EXTRACT(xml, '/a/b/text()') | <path> for XPath | 配置文件读取 |
发表评论