SELF
返回知识库ORACLE / FUNCTION REFERENCE

ORACLE / REFERENCE

Oracle 函数手册。

函数、表达式与相关语法按主题收录。179 是知识条目数,其中包含补充说明,并非不同函数的数量。

此手册用于查阅与学习;部分示例依赖 SCOTT 示例表、Oracle 版本和会话设置。运行前请在目标数据库核对。Oracle 官方函数目录
179 / 179 条

字符函数

25 条

ASCII

所有版本

返回指定字符的 ASCII 码值。若传入字符串,只取第一个字符。

语法ASCII(char)
使用要点

与 CHR 互为逆函数;传入 NULL 返回 NULL。

示例 SQL
SELECT ASCII('A') FROM dual;
示例结果65

CHR

所有版本

返回数据库字符集中与整数 n 对应的字符。

语法CHR(n [USING NCHAR_CS])
使用要点

n 按数据库字符集(或 USING NCHAR_CS 指定的国家字符集)的字符编码解释;多字节字符须传入完整编码值,不能一概当作 Unicode 码点。CHR(10) 常用于换行,CHR(9) 常用于制表。

示例 SQL
SELECT CHR(65) || CHR(66) FROM dual;
示例结果AB

CONCAT

所有版本

把 char2 拼接到 char1 之后,等同于 || 运算符。

语法CONCAT(char1, char2)
使用要点

只支持两个参数;要连多个串请用 || 或嵌套。

示例 SQL
SELECT CONCAT('Hello', ' World') FROM dual;
示例结果Hello World

INITCAP

所有版本

将字符串中每个单词的首字母转为大写,其余字母转为小写。

语法INITCAP(char)
使用要点

以空格或非字母数字字符作为单词分隔。

示例 SQL
SELECT INITCAP('hello world oracle') FROM dual;
示例结果Hello World Oracle

LOWER

所有版本

将字符串全部转换为小写。

语法LOWER(char)
使用要点

常用于忽略大小写的比较;LOWER 与 UPPER 互为反向。

示例 SQL
SELECT LOWER('ORACLE SQL') FROM dual;
示例结果oracle sql

UPPER

所有版本

将字符串全部转换为大写。

语法UPPER(char)
使用要点

索引列上使用会导致索引失效(除非建了函数索引),大表过滤慎用。

示例 SQL
SELECT UPPER('oracle sql') FROM dual;
示例结果ORACLE SQL

NLS_INITCAP

所有版本(8.0 起)

按指定排序规则做首字母大写转换,可处理特殊语言的大小写规则。

语法NLS_INITCAP(char [, 'nlsparam'])
使用要点

nlsparam 形如 'NLS_SORT=XGERMAN';一般场景直接用 INITCAP 即可。

示例 SQL
SELECT NLS_INITCAP('ijsland', 'NLS_SORT=XDutch') FROM dual;
示例结果IJsland

LOWER/UPPER 组合

所有版本

演示大小写函数可嵌套组合使用。

语法LOWER(UPPER(char))
使用要点

嵌套无实际增益,仅作演示;实际写一层即可。

示例 SQL
SELECT LOWER(UPPER('Oracle')) FROM dual;
示例结果oracle

LPAD

所有版本

在字符串左侧填充字符,使其达到长度 n。

语法LPAD(expr1, n [, expr2])
使用要点

expr2 默认空格;若 n 小于原串长度,则从左侧截断到 n 位,这是格式化输出的常用技巧。

示例 SQL
SELECT LPAD('7', 3, '0') FROM dual;
示例结果007

RPAD

所有版本

在字符串右侧填充字符,使其达到长度 n。

语法RPAD(expr1, n [, expr2])
使用要点

与 LPAD 对称;n 小于原串长度时从右侧截断。

示例 SQL
SELECT RPAD('abc', 6, '*') FROM dual;
示例结果abc***

LTRIM

所有版本

从字符串左侧删除出现在 set 中的所有字符,直到遇到不在 set 中的字符为止。

语法LTRIM(char [, set])
使用要点

set 是按“字符集合”而非“字符串”匹配的;不写 set 默认去左侧空格。

示例 SQL
SELECT LTRIM('xxxyxOracle', 'xy') FROM dual;
示例结果Oracle

RTRIM

所有版本

从字符串右侧删除出现在 set 中的所有字符。

语法RTRIM(char [, set])
使用要点

set 同样是字符集合语义,不是去后缀字符串。要去指定后缀请用 REGEXP_REPLACE。

示例 SQL
SELECT RTRIM('Oraclexxyxx', 'xy') FROM dual;
示例结果Oracle

TRIM

所有版本

按指定方向去除首尾字符,默认去除两端空格。

语法TRIM([ {LEADING|TRAILING|BOTH} trim_char FROM] char)
使用要点

TRIM 一次只能指定一个 trim_char;TRIM(char) 仅接受单参数去空格形式。

示例 SQL
SELECT TRIM(BOTH '*' FROM '**Oracle**') FROM dual;
示例结果Oracle

REPLACE

所有版本

将字符串中所有 search_string 替换为 replacement_string。

语法REPLACE(char, search_string [, replacement_string])
使用要点

replacement_string 省略时等价于删除 search_string;search_string 为空则原样返回。

示例 SQL
SELECT REPLACE('abcabc', 'b', 'X') FROM dual;
示例结果aXcaXc

TRANSLATE

所有版本

按字符逐一映射替换:from_string 中第 i 个字符替换为 to_string 中第 i 个字符。

语法TRANSLATE(expr, from_string, to_string)
使用要点

与 REPLACE 不同,TRANSLATE 是单字符级映射。to_string 为空字符串时在 Oracle 中视为 NULL,结果也为 NULL;要删除字符,可在 from_string 前加一个保留字符,并只把该字符写入 to_string。

示例 SQL
SELECT TRANSLATE('2KRW229', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') FROM dual;
示例结果9XXX999

SUBSTR

所有版本

从 position 位置起截取指定长度的子串。

语法SUBSTR(char, position [, substring_length])
使用要点

position 为正从左数、为负从右数;position=0 视为 1;省略长度则截到末尾。

示例 SQL
SELECT SUBSTR('Oracle SQL', 8, 3) FROM dual;
示例结果SQL

SUBSTRB

所有版本

按字节而非字符截取子串。

语法SUBSTRB(char, position [, length])
使用要点

多字节字符集(如 UTF-8 中文占 3 字节)下按字节切可能截断半个汉字,产生乱码。

示例 SQL
SELECT SUBSTRB('ABCDE', 2, 3) FROM dual;
示例结果BCD

INSTR

所有版本

返回 substring 在 string 中首次出现的位置(从 1 开始)。

语法INSTR(string, substring [, position [, occurrence]])
使用要点

position 为负表示从右往左搜索;occurrence 指定第几次出现;未找到返回 0。

示例 SQL
SELECT INSTR('Oracle SQL SQL', 'SQL', 1, 2) FROM dual;
示例结果12

INSTRB

所有版本

与 INSTR 相同,但返回的是字节位置而非字符位置。

语法INSTRB(string, substring [, position [, occurrence]])
使用要点

多字节字符集下返回值会大于 INSTR。

示例 SQL
SELECT INSTRB('ABCABC', 'B') FROM dual;
示例结果2

LENGTH

所有版本

返回字符串的字符个数。

语法LENGTH(char)
使用要点

中文在 UTF-8 下算 1 个字符;要算字节数用 LENGTHB。

示例 SQL
SELECT LENGTH('Oracle') FROM dual;
示例结果6

LENGTHB

所有版本

返回字符串占用的字节数。

语法LENGTHB(char)
使用要点

数据库字符集为 AL32UTF8 时,一个汉字通常占 3 字节,可用于校验字段长度是否超限。

示例 SQL
SELECT LENGTHB('Oracle') FROM dual;
示例结果6

REGEXP_SUBSTR

10g 起

按正则表达式从字符串中提取匹配的子串。

语法REGEXP_SUBSTR(source, pattern [, position [, occurrence [, match_param [, subexpr]]]])
使用要点

occurrence 指定取第几个匹配;subexpr 取捕获组(0 表示整个匹配)。

示例 SQL
SELECT REGEXP_SUBSTR('aaa,bbb,ccc', '[^,]+', 1, 2) FROM dual;
示例结果bbb

SOUNDEX

所有版本

返回字符串的语音表示,用于按英文发音做模糊匹配。

语法SOUNDEX(char)
使用要点

源自英文发音规则,对中文无效;长度固定为 4 位。

示例 SQL
SELECT SOUNDEX('Smith'), SOUNDEX('Smyth') FROM dual;
示例结果S530 S530

NLSSORT

所有版本

返回字符串的排序键值,让排序遵循指定语言的排序规则。

语法NLSSORT(char [, 'nlsparam'])
使用要点

常写作 ORDER BY NLSSORT(name,'NLS_SORT=SCHINESE_PINYIN_M') 实现中文按拼音排序。

示例 SQL
SELECT * FROM t ORDER BY NLSSORT(name, 'NLS_SORT=SCHINESE_PINYIN_M');
示例结果按拼音顺序返回(阿、白、陈…)

WM_CONCAT (废弃)

10g/11g(12c 已移除)

早期版本的字符串聚合函数,把分组内的值用逗号拼接成一个字符串。

语法WM_CONCAT(expr)
使用要点

非官方文档函数,12c 起已移除,请改用 LISTAGG。

示例 SQL
SELECT deptno, WM_CONCAT(ename) FROM emp GROUP BY deptno;
示例结果10 CLARK,MILLER,KING

数字函数

19 条

ABS

所有版本

返回数值的绝对值。

语法ABS(n)
使用要点

对 NULL 返回 NULL。

示例 SQL
SELECT ABS(-12.5) FROM dual;
示例结果12.5

CEIL

所有版本

向上取整,返回大于等于 n 的最小整数。

语法CEIL(n)
使用要点

与 FLOOR 相对;对负数 CEIL(-1.5) = -1。

示例 SQL
SELECT CEIL(3.1), CEIL(-3.1) FROM dual;
示例结果4 -3

FLOOR

所有版本

向下取整,返回小于等于 n 的最大整数。

语法FLOOR(n)
使用要点

FLOOR(-3.1) = -4,注意负数方向。

示例 SQL
SELECT FLOOR(3.9), FLOOR(-3.1) FROM dual;
示例结果3 -4

ROUND

所有版本

按指定小数位四舍五入。

语法ROUND(n [, integer])
使用要点

第二个参数可为负,表示对整数位四舍五入,如 ROUND(1234,-2)=1200。

示例 SQL
SELECT ROUND(3.14159, 2), ROUND(1234.5, -2) FROM dual;
示例结果3.14 1200

TRUNC

所有版本

按指定小数位截断,不进行舍入;也用于日期截断。

语法TRUNC(n [, integer])
使用要点

TRUNC(3.99,0)=3,直接丢弃;负数位截断整数部分。

示例 SQL
SELECT TRUNC(3.99), TRUNC(1234.5678, 2) FROM dual;
示例结果3 1234.56

MOD

所有版本

返回 n2 除以 n1 的余数。

语法MOD(n2, n1)
使用要点

n1 为 0 时返回 n2;符号与被除数一致。常用于奇偶判断、分片路由。

示例 SQL
SELECT MOD(10, 3) FROM dual;
示例结果1

REMAINDER

所有版本

返回 n2 除以 n1 的余数,但采用舍入到最近整数的方式(IEEE 余数)。

语法REMAINDER(n2, n1)
使用要点

与 MOD 的差别在 .5 边界:REMAINDER(5,2)=1,而 MOD(5,2)=1;REMAINDER(3,2)=-1。

示例 SQL
SELECT REMAINDER(3, 2), MOD(3, 2) FROM dual;
示例结果-1 1

POWER

所有版本

返回 n2 的 n1 次幂。

语法POWER(n2, n1)
使用要点

n1 可为小数,用于开方等运算。

示例 SQL
SELECT POWER(2, 10) FROM dual;
示例结果1024

SQRT

所有版本

返回 n 的平方根。

语法SQRT(n)
使用要点

n 为负数时报错 ORA-01428。

示例 SQL
SELECT SQRT(144) FROM dual;
示例结果12

EXP

所有版本

返回 e 的 n 次幂(自然指数)。

语法EXP(n)
使用要点

与 LN 互为逆运算,常用于复利、增长模型计算。

示例 SQL
SELECT ROUND(EXP(1), 5) FROM dual;
示例结果2.71828

LN

所有版本

返回 n 的自然对数(以 e 为底)。

语法LN(n)
使用要点

n 必须大于 0,否则报错。

示例 SQL
SELECT ROUND(LN(10), 5) FROM dual;
示例结果2.30259

LOG

所有版本

返回以 n2 为底 n1 的对数。

语法LOG(n2, n1)
使用要点

LOG(10, 100) = 2;底数不能为 1 或负数。

示例 SQL
SELECT LOG(10, 1000) FROM dual;
示例结果3

SIGN

所有版本

返回 n 的符号:正数返回 1,负数返回 -1,0 返回 0。

语法SIGN(n)
使用要点

常用来在排序或条件判断中区分正负。

示例 SQL
SELECT SIGN(-8), SIGN(0), SIGN(8) FROM dual;
示例结果-1 0 1

BITAND

所有版本

两个数值按位与运算。

语法BITAND(expr1, expr2)
使用要点

Oracle 早期没有独立位运算符,常用 BITAND 配合实现位标志位判断,如判断权限位。

示例 SQL
SELECT BITAND(6, 3) FROM dual;
示例结果2

GREATEST

所有版本

返回参数列表中的最大值。

语法GREATEST(expr1, expr2, ...)
使用要点

可混合数字与字符串,但会比较规则可能导致意外;任一参数为 NULL 时结果通常为 NULL。

示例 SQL
SELECT GREATEST(10, 25, 7) FROM dual;
示例结果25

LEAST

所有版本

返回参数列表中的最小值。

语法LEAST(expr1, expr2, ...)
使用要点

与 GREATEST 相对;注意 NULL 传播特性。

示例 SQL
SELECT LEAST(10, 25, 7) FROM dual;
示例结果7

WIDTH_BUCKET

所有版本

将数值按等宽区间分桶,返回所属桶编号(从 1 开始;越界返回 0 或 num_buckets+1)。

语法WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
使用要点

常用于制作数值分布直方图、分段统计。

示例 SQL
SELECT WIDTH_BUCKET(85, 0, 100, 5) FROM dual;
示例结果5

NANVL

所有版本

若 n1 为 NaN(非数字)则返回 n2,否则返回 n1。

语法NANVL(n1, n2)
使用要点

针对 BINARY_FLOAT/BINARY_DOUBLE 的专用函数,对普通 NUMBER 无意义。

示例 SQL
SELECT NANVL(BINARY_DOUBLE_NAN, 0) FROM dual;
示例结果0.0

TO_NUMBER (数字用)

所有版本

把字符串按格式转换为数字。

语法TO_NUMBER(expr [, format [, nlsparam]])
使用要点

用 '9' 占位数字、'0' 强制补零、'$' 货币符、'S' 正负号等;转换失败报 ORA-01722。

示例 SQL
SELECT TO_NUMBER('$1,234.56', '$9,999.99') FROM dual;
示例结果1234.56

日期时间函数

24 条

SYSDATE

所有版本

返回数据库服务器当前日期时间,精度到秒。

语法SYSDATE
使用要点

无参数、无需 FROM dual 也可用;不带时区信息,客户端时区不影响它。

示例 SQL
SELECT SYSDATE FROM dual;
示例结果2026-09-22 09:29:22

SYSTIMESTAMP

所有版本

返回数据库服务器当前时间戳,含时区与小数秒(TIMESTAMP WITH TIME ZONE)。

语法SYSTIMESTAMP
使用要点

精度取决于平台,通常为毫秒/微秒级;跨时区系统建议用它。

示例 SQL
SELECT SYSTIMESTAMP FROM dual;
示例结果22-9月-26 09.29.22.123456 +08:00

CURRENT_DATE

所有版本

返回当前会话时区下的日期时间。

语法CURRENT_DATE
使用要点

与 SYSDATE 的区别是会话时区,可用于跨时区应用。

示例 SQL
SELECT CURRENT_DATE FROM dual;
示例结果2026-09-22 09:29:22

CURRENT_TIMESTAMP

所有版本

返回当前会话时区下的时间戳(含时区)。

语法CURRENT_TIMESTAMP [ (precision) ]
使用要点

带小数秒精度参数可选,如 CURRENT_TIMESTAMP(3)。

示例 SQL
SELECT CURRENT_TIMESTAMP(3) FROM dual;
示例结果26-9月-22 09.29.22.123 +08:00

LOCALTIMESTAMP

所有版本

返回当前会话时区的本地时间戳,不含时区信息。

语法LOCALTIMESTAMP [ (precision) ]
使用要点

适合存入 TIMESTAMP 字段而不想带时区的场景。

示例 SQL
SELECT LOCALTIMESTAMP FROM dual;
示例结果22-9月-26 09.29.22.123000

DBTIMEZONE

所有版本

返回数据库时区名称。

语法DBTIMEZONE
使用要点

只读,修改需用 ALTER DATABASE SET TIME_ZONE。

示例 SQL
SELECT DBTIMEZONE FROM dual;
示例结果+08:00

SESSIONTIMEZONE

所有版本

返回当前会话的时区。

语法SESSIONTIMEZONE
使用要点

可通过 ALTER SESSION SET TIME_ZONE 临时修改。

示例 SQL
SELECT SESSIONTIMEZONE FROM dual;
示例结果+08:00

ADD_MONTHS

所有版本

在日期上增加 n 个月,n 可为负数。

语法ADD_MONTHS(date, n)
使用要点

会自动处理月末对齐:ADD_MONTHS('2026-01-31',1) = 2026-02-28(该年 2 月无 31 日)。

示例 SQL
SELECT ADD_MONTHS(DATE '2026-01-31', 1) FROM dual;
示例结果2026-02-28

MONTHS_BETWEEN

所有版本

返回 date1 与 date2 之间的月数。

语法MONTHS_BETWEEN(date1, date2)
使用要点

两日若同为月末则返回整数;否则按 31 天一月折算,可能出现小数(如 1.03225806)。

示例 SQL
SELECT MONTHS_BETWEEN(SYSDATE, DATE '2026-01-01') FROM dual;
示例结果8.6774...

LAST_DAY

所有版本

返回该日期所在月份的最后一天。

语法LAST_DAY(date)
使用要点

做月度报表统计时非常常用,返回带时分秒的日期。

示例 SQL
SELECT LAST_DAY(DATE '2026-02-15') FROM dual;
示例结果2026-02-28

NEXT_DAY

所有版本

返回 date 之后的下一个指定星期几的日期。

语法NEXT_DAY(date, char)
使用要点

char 受会话 NLS_LANGUAGE 影响(中文环境可写 '星期一'),也可用数字 1=周日。

示例 SQL
SELECT NEXT_DAY(DATE '2026-09-22', '星期五') FROM dual;
示例结果2026-09-25

TRUNC (日期)

所有版本

按指定精度把日期截断到起点。

语法TRUNC(date [, fmt])
使用要点

常用格式:'YYYY' 年初、'MM' 月初、'DD' 当天零点、'HH' 整点、'Q' 季初、'IW' 本周周一。

示例 SQL
SELECT TRUNC(SYSDATE, 'MM') FROM dual;
示例结果2026-09-01 00:00:00

ROUND (日期)

所有版本

按指定精度对日期四舍五入。

语法ROUND(date [, fmt])
使用要点

ROUND(SYSDATE,'MM') 以每月 16 日为界,15 日及之前回到月初,16 日及之后进到次月初。

示例 SQL
SELECT ROUND(DATE '2026-09-20', 'MM') FROM dual;
示例结果2026-10-01

EXTRACT

所有版本

从日期或时间戳中提取年、月、日、时、分、秒等字段。

语法EXTRACT(fmt FROM expr)
使用要点

fmt 可为 YEAR/MONTH/DAY/HOUR/MINUTE/SECOND/TIMEZONE_HOUR/YEAR TO MONTH 等。

示例 SQL
SELECT EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE) FROM dual;
示例结果2026 9

TO_CHAR (日期)

所有版本

把日期按格式模型转成字符串。

语法TO_CHAR(date [, fmt [, nlsparam]])
使用要点

DATE 常用模型:YYYY 年、MM 月、DD 日、HH24 24小时、MI 分、SS 秒、DY 星期缩写、DAY 星期全称、MON 月份缩写、Q 季度、DDD 年内天数、IW 周数;FF3 毫秒仅适用于 TIMESTAMP 等支持小数秒的类型。

示例 SQL
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
示例结果2026-09-22 09:29:22

TO_DATE

所有版本

把字符串按格式模型解析为日期。

语法TO_DATE(char [, fmt [, nlsparam]])
使用要点

强烈建议显式写 fmt,否则依赖会话 NLS_DATE_FORMAT,易出现 ORA-01861 或错误解析。

示例 SQL
SELECT TO_DATE('2026-09-22 09:30:00', 'YYYY-MM-DD HH24:MI:SS') FROM dual;
示例结果2026-09-22 09:30:00

TO_TIMESTAMP

所有版本

把字符串转换为 TIMESTAMP 类型,支持小数秒。

语法TO_TIMESTAMP(char [, fmt])
使用要点

格式串中用 FF3/FF6 表示毫秒/微秒。

示例 SQL
SELECT TO_TIMESTAMP('2026-09-22 09:30:00.123', 'YYYY-MM-DD HH24:MI:SS.FF3') FROM dual;
示例结果22-9月-26 09.30.00.123000000

TO_TIMESTAMP_TZ

所有版本

把带时区信息的字符串转换为 TIMESTAMP WITH TIME ZONE。

语法TO_TIMESTAMP_TZ(char [, fmt])
使用要点

格式串需含 TZH:TZM,如 'YYYY-MM-DD HH24:MI:SS TZH:TZM'。

示例 SQL
SELECT TO_TIMESTAMP_TZ('2026-09-22 09:30:00 +08:00', 'YYYY-MM-DD HH24:MI:SS TZH:TZM') FROM dual;
示例结果22-9月-26 09.30.00.000000000 +08:00

NUMTODSINTERVAL

9i 起

把数字转换为 INTERVAL DAY TO SECOND 字面量。

语法NUMTODSINTERVAL(n, 'interval_unit')
使用要点

interval_unit 可为 DAY/HOUR/MINUTE/SECOND,用于做精确的加减。

示例 SQL
SELECT SYSDATE + NUMTODSINTERVAL(90, 'MINUTE') FROM dual;
示例结果当前时间 + 1.5 小时

NUMTOYMINTERVAL

9i 起

把数字转换为 INTERVAL YEAR TO MONTH 字面量。

语法NUMTOYMINTERVAL(n, 'interval_unit')
使用要点

interval_unit 可为 YEAR 或 MONTH。

示例 SQL
SELECT SYSDATE + NUMTOYMINTERVAL(3, 'MONTH') FROM dual;
示例结果当前日期 + 3 个月

NEW_TIME

所有版本

把日期从 zone1 时区转换到 zone2 时区。

语法NEW_TIME(date, zone1, zone2)
使用要点

zone 用缩写(AST/EST/GMT/PST 等),不支持夏令时自动调整,且缩写歧义较多,现在更推荐带时区的类型。

示例 SQL
SELECT NEW_TIME(TO_DATE('2026-09-22 09:00:00','YYYY-MM-DD HH24:MI:SS'), 'GMT', 'EST') FROM dual;
示例结果2026-09-22 04:00:00

FROM_TZ

9i 起

给一个 TIMESTAMP 附加时区信息,生成 TIMESTAMP WITH TIME ZONE。

语法FROM_TZ(timestamp, 'time_zone')
使用要点

常与 AT TIME ZONE 配合做时区换算。

示例 SQL
SELECT FROM_TZ(TIMESTAMP '2026-09-22 09:00:00', '+08:00') FROM dual;
示例结果22-9月-26 09.00.00.000000000 +08:00

AT TIME ZONE

9i 起

把带时区的时间戳转换到另一个时区。

语法expr AT TIME ZONE zone
使用要点

用法示例:SYSTIMESTAMP AT TIME ZONE 'UTC'。

示例 SQL
SELECT SYSTIMESTAMP AT TIME ZONE 'UTC' FROM dual;
示例结果22-9月-26 01.29.22.123 +00:00

SYS_EXTRACT_UTC

9i 起

把带时区的时间戳转换为 UTC 时间。

语法SYS_EXTRACT_UTC(datetime_with_timezone)
使用要点

返回类型为 TIMESTAMP,不含时区。

示例 SQL
SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) FROM dual;
示例结果22-9月-26 01.29.22.123000000

类型转换函数

12 条

CAST

所有版本

把表达式显式转换为指定数据类型,遵循 ANSI SQL 标准。

语法CAST(expr AS type_name)
使用要点

支持在大部分内置类型间转换;比 TO_CHAR 等更通用,但格式控制能力较弱。

示例 SQL
SELECT CAST('123' AS NUMBER) + 1 FROM dual;
示例结果124

TO_CHAR (数字)

所有版本

把数字按格式模型转为字符串。

语法TO_CHAR(n [, fmt [, nlsparam]])
使用要点

常用模型:9 占位、0 补零、$ 货币、L 本地货币、. 小数点、, 千分位、FM 去首尾空格、MI 负号在后、EEEE 科学计数。

示例 SQL
SELECT TO_CHAR(1234567.89, 'FM$9,999,999.00') FROM dual;
示例结果$1,234,567.89

TO_CLOB

8i 起

把字符数据转换为 CLOB 大对象类型。

语法TO_CLOB(char)
使用要点

拼接超长文本(>4000 字节)时用它避免字符串长度限制。

示例 SQL
SELECT TO_CLOB('很长的一段文本...') FROM dual;
示例结果CLOB 类型值

TO_BLOB

8i 起

把 RAW 类型转换为 BLOB。

语法TO_BLOB(raw_value)
使用要点

常与 UTL_RAW 包配合处理二进制数据。

示例 SQL
SELECT TO_BLOB(HEXTORAW('4F5241')) FROM dual;
示例结果BLOB 值(内容为 ORA)

TO_LOB

8i 起

把 LONG 或 LONG RAW 列转换为 LOB 类型。

语法TO_LOB(long_column)
使用要点

只能用于 INSERT ... SELECT 中,不能直接出现在普通表达式里。

示例 SQL
INSERT INTO t_new SELECT TO_LOB(long_col) FROM t_old;
示例结果迁移 LONG 到 CLOB 成功

TO_MULTI_BYTE

所有版本

把单字节字符转换为对应的多字节(全角)字符。

语法TO_MULTI_BYTE(char)
使用要点

仅对字符集中存在对应全角形式的字符有效。

示例 SQL
SELECT TO_MULTI_BYTE('ABC') FROM dual;
示例结果ABC

TO_SINGLE_BYTE

所有版本

把多字节(全角)字符转换为对应的单字节(半角)字符。

语法TO_SINGLE_BYTE(char)
使用要点

数据清洗中常用于把用户输入的全角数字、字母统一成半角。

示例 SQL
SELECT TO_SINGLE_BYTE('ABC123') FROM dual;
示例结果ABC123

HEXTORAW

所有版本

把十六进制字符串转换为 RAW 值。

语法HEXTORAW(char)
使用要点

字符串须为偶数个十六进制字符,否则报错。

示例 SQL
SELECT HEXTORAW('4F5241') FROM dual;
示例结果RAW 值 4F5241(即 'ORA')

RAWTOHEX

所有版本

把 RAW 值转换为十六进制字符串。

语法RAWTOHEX(raw_value)
使用要点

与 HEXTORAW 互逆;可用于查看二进制内容。

示例 SQL
SELECT RAWTOHEX(HEXTORAW('4F5241')) FROM dual;
示例结果4F5241

ROWIDTOCHAR

所有版本

把 ROWID 伪列转换为字符串格式。

语法ROWIDTOCHAR(rowid)
使用要点

ROWID 定位单行最快,可作为去重、快速更新的依据。

示例 SQL
SELECT ROWIDTOCHAR(ROWID) FROM emp WHERE rownum = 1;
示例结果AAAESeAAEAAAAFyAAA

CHARTOROWID

所有版本

把字符串转换为 ROWID 类型。

语法CHARTOROWID(char)
使用要点

与 ROWIDTOCHAR 互逆。

示例 SQL
SELECT CHARTOROWID('AAAESeAAEAAAAFyAAA') FROM dual;
示例结果AAAESeAAEAAAAFyAAA

BFILENAME

8i 起

返回指向服务器端 BFILE 文件的定位器。

语法BFILENAME('directory', 'filename')
使用要点

需先 CREATE DIRECTORY 授权,然后再用 DBMS_LOB 读取。

示例 SQL
SELECT BFILENAME('MYDIR', 'img.png') FROM dual;
示例结果BFILE 定位器

聚合函数

18 条

COUNT

所有版本

统计行数或非空值的个数。

语法COUNT({* | [DISTINCT|ALL] expr})
使用要点

COUNT(*) 统计所有行含 NULL;COUNT(col) 忽略 NULL;COUNT(DISTINCT col) 统计去重后的非空值。

示例 SQL
SELECT COUNT(*), COUNT(comm), COUNT(DISTINCT deptno) FROM emp;
示例结果14 4 3

SUM

所有版本

对数值列求和,忽略 NULL。

语法SUM([DISTINCT|ALL] n)
使用要点

所有行都为 NULL 时返回 NULL 而非 0,展示层常需 NVL(SUM(x), 0)。

示例 SQL
SELECT SUM(sal) FROM emp WHERE deptno = 10;
示例结果8750

AVG

所有版本

计算平均值,忽略 NULL 行。

语法AVG([DISTINCT|ALL] n)
使用要点

注意分母是不为 NULL 的行数,而不是总行数。

示例 SQL
SELECT ROUND(AVG(sal), 2) FROM emp WHERE deptno = 10;
示例结果2916.67

MIN

所有版本

返回表达式的最小值,可用于数字、字符串、日期。

语法MIN([DISTINCT|ALL] expr)
使用要点

字符串按排序规则比较;NULL 被忽略。

示例 SQL
SELECT MIN(hiredate), MIN(sal) FROM emp;
示例结果1980-12-17 00:00:00 800

MAX

所有版本

返回表达式的最大值。

语法MAX([DISTINCT|ALL] expr)
使用要点

常用于取最新时间、最大编号;配合 KEEP DENSE_RANK 可实现组内取对应行。

示例 SQL
SELECT MAX(sal) FROM emp;
示例结果5000

STDDEV

所有版本

返回样本标准差(分母为 n-1)。

语法STDDEV([DISTINCT|ALL] n)
使用要点

衡量数据离散程度;只有一行非 NULL 数据时 STDDEV 返回 0,STDDEV_SAMP 才返回 NULL。

示例 SQL
SELECT ROUND(STDDEV(sal), 2) FROM emp;
示例结果1182.5

STDDEV_POP

8i 起

返回总体标准差(分母为 n)。

语法STDDEV_POP(n)
使用要点

与 STDDEV 的区别在于分母;样本量即全体时用 POP 版。

示例 SQL
SELECT ROUND(STDDEV_POP(sal), 2) FROM emp;
示例结果1141.29

VARIANCE

所有版本

返回样本方差(标准差的平方)。

语法VARIANCE([DISTINCT|ALL] n)
使用要点

与 STDDEV 配套使用。

示例 SQL
SELECT ROUND(VARIANCE(sal), 2) FROM emp;
示例结果1398312.57

VAR_POP

8i 起

返回总体方差。

语法VAR_POP(n)
使用要点

分母为 n,属于总体统计口径。

示例 SQL
SELECT ROUND(VAR_POP(sal), 2) FROM emp;
示例结果1302531.25

MEDIAN

所有版本

返回中位数。

语法MEDIAN(expr)
使用要点

对偶数行数会取中间两个值的平均;也可作为分析函数带 OVER 使用。

示例 SQL
SELECT MEDIAN(sal) FROM emp;
示例结果1550

LISTAGG

11g R2 起

把分组内的值按指定顺序拼接成一个字符串(行转列)。

语法LISTAGG(measure_expr [, delimiter]) WITHIN GROUP (ORDER BY expr)
使用要点

结果为 VARCHAR2,11g 上限 4000 字节,超长报 ORA-01489;12c R2(12.2)起支持 ON OVERFLOW TRUNCATE 处理溢出。是 WM_CONCAT 的官方替代。

示例 SQL
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) FROM emp GROUP BY deptno;
示例结果10 CLARK,KING,MILLER

LISTAGG (溢出处理)

12c R2 起

12c 新增的溢出处理语法,避免拼接超长直接报错。

语法LISTAGG(... ON OVERFLOW {ERROR|TRUNCATE} [WITH COUNT]) WITHIN GROUP (...)
使用要点

TRUNCATE 会在超长时截断到允许长度,可加 WITH COUNT 显示被截断的条数。

示例 SQL
SELECT LISTAGG(ename, ',' ON OVERFLOW TRUNCATE '...' WITH COUNT) WITHIN GROUP (ORDER BY ename) FROM emp;
示例结果SMITH,ALLEN,...(11)

COLLECT

8i 起

把一列值聚合成集合类型(嵌套表)。

语法COLLECT(column)
使用要点

常与 TABLE() 配合实现集合到行的展开;多用于 PL/SQL。

示例 SQL
SELECT CAST(COLLECT(deptno) AS sys.odcinumberlist) FROM emp;
示例结果ODCINUMBERLIST(10, 20, 30)

GROUP_ID

8i 起

配合 GROUP BY 的 ROLLUP/CUBE 使用,标识重复分组(值为 0 表示首次出现,>0 表示重复)。

语法GROUP_ID()
使用要点

用于在 ROLLUP 结果中去重重复的小计行。

示例 SQL
SELECT deptno, job, GROUP_ID() FROM emp GROUP BY ROLLUP(deptno, job);
示例结果按分组返回 0 或 1

GROUPING

8i 起

判断某列是否参与了当前分组:参与返回 0,未参与(小计/合计行)返回 1。

语法GROUPING(expr)
使用要点

与 ROLLUP/CUBE 搭配,给汇总行打标记,配合 CASE 输出「小计」「合计」文字。

示例 SQL
SELECT deptno, SUM(sal), GROUPING(deptno) FROM emp GROUP BY ROLLUP(deptno);
示例结果30 9400 0 / (null) 29025 1

GROUPING_ID

8i 起

返回各列 GROUPING 值组成的位向量对应的整数,便于一次判断多列汇总层级。

语法GROUPING_ID(expr1, expr2, ...)
使用要点

参数顺序与 GROUP BY 中列顺序一致。

示例 SQL
SELECT deptno, job, GROUPING_ID(deptno, job) FROM emp GROUP BY ROLLUP(deptno, job);
示例结果0/1/2/3 表示不同汇总层级

ROLLUP/CUBE (分组扩展)

8i 起

ROLLUP 生成逐级小计与合计;CUBE 生成所有维度组合;GROUPING SETS 精确指定需要哪些分组。

语法GROUP BY ROLLUP(a,b) | CUBE(a,b) | GROUPING SETS((a),(b))
使用要点

它们是 GROUP BY 的扩展而非函数,但必须与聚合函数配合,是制作多维报表的核心手段。

示例 SQL
SELECT deptno, job, SUM(sal) FROM emp GROUP BY CUBE(deptno, job);
示例结果返回部门×岗位所有组合的汇总

KEEP (DENSE_RANK FIRST/LAST)

9i 起

在聚合时只取排序后第一/最后一名的行做聚合,可一次取出「最大值对应的那条记录的其他字段」。

语法aggregate KEEP (DENSE_RANK FIRST|LAST ORDER BY expr) [OVER (...)]
使用要点

经典用法:取每个部门薪资最高者的姓名,避免写自连接或子查询。

示例 SQL
SELECT deptno, MAX(ename) KEEP (DENSE_RANK FIRST ORDER BY sal DESC) FROM emp GROUP BY deptno;
示例结果10 KING / 20 SCOTT / 30 BLAKE

分析(窗口)函数

14 条

ROW_NUMBER

8i 起

为分区内每行生成连续唯一的序号。

语法ROW_NUMBER() OVER ([PARTITION BY ...] ORDER BY ...)
使用要点

相同排序值也会得到不同编号;去重时经典的 ROW_NUMBER()=1 取每组一条。

示例 SQL
SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) rn FROM emp;
示例结果KING 5000 1 / SCOTT 3000 2 ...

RANK

8i 起

按排序计算名次,相同值并列且占用后续序号(如 1,2,2,4)。

语法RANK() OVER ([PARTITION BY ...] ORDER BY ...)
使用要点

跳号特性适合「并列第几名」的展示;不跳号用 DENSE_RANK。

示例 SQL
SELECT ename, sal, RANK() OVER (ORDER BY sal DESC) rk FROM emp;
示例结果KING 5000 1 / SCOTT 3000 2 / FORD 3000 2 / JONES 2975 4

DENSE_RANK

8i 起

按排序计算名次,相同值并列且不跳号(如 1,2,2,3)。

语法DENSE_RANK() OVER ([PARTITION BY ...] ORDER BY ...)
使用要点

分组取 TOP-N(如每部门薪资前三)推荐用它,名次更紧凑。

示例 SQL
SELECT ename, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) dr FROM emp;
示例结果每个部门内 1,1,2,3 形式的名次

NTILE

8i 起

把分区内的行尽量平均分成 n 个桶,返回所在桶编号。

语法NTILE(n) OVER ([PARTITION BY ...] ORDER BY ...)
使用要点

常用于分位数分析、把数据均分为「高中低」几档。

示例 SQL
SELECT ename, sal, NTILE(4) OVER (ORDER BY sal) quartile FROM emp;
示例结果按薪资四等分返回 1~4

LAG

8i 起

取当前行之前的第 offset 行的值(默认 1 行前)。

语法LAG(expr [, offset [, default]]) OVER (...)
使用要点

做环比、同比、前后对比的核心函数;第一行没有前行时返回 default(默认 NULL)。

示例 SQL
SELECT sal, LAG(sal, 1, 0) OVER (ORDER BY hiredate) prev_sal FROM emp;
示例结果每行返回上一入职者的薪资

LEAD

8i 起

取当前行之后的第 offset 行的值(默认 1 行后)。

语法LEAD(expr [, offset [, default]]) OVER (...)
使用要点

与 LAG 方向相反,常用于计算到下一笔记录的时间间隔。

示例 SQL
SELECT hiredate, LEAD(hiredate) OVER (ORDER BY hiredate) next_hire FROM emp;
示例结果每行返回下一个入职日期

FIRST_VALUE

8i 起

返回窗口内第一行的值。

语法FIRST_VALUE(expr) OVER (...)
使用要点

常配合 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 实现累计或对比基准值。

示例 SQL
SELECT sal, FIRST_VALUE(sal) OVER (ORDER BY sal DESC) max_sal FROM emp;
示例结果每行都返回 5000

LAST_VALUE

8i 起

返回窗口内最后一行的值。

语法LAST_VALUE(expr) OVER (...)
使用要点

默认窗口到当前行,所以直接写会返回当前行值;要取全局最后一行必须写 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。

示例 SQL
SELECT sal, LAST_VALUE(sal) OVER (ORDER BY sal ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) max_sal FROM emp;
示例结果每行都返回 5000

NTH_VALUE

11g R2 起

返回窗口内第 n 行的值。

语法NTH_VALUE(expr, n) [FROM FIRST|LAST] OVER (...)
使用要点

n 超出行数返回 NULL;可指定从首端或末端计数。

示例 SQL
SELECT sal, NTH_VALUE(sal, 2) FROM FIRST OVER (ORDER BY sal DESC) second_sal FROM emp;
示例结果每行返回薪资第 2 高值 3000

SUM/AVG/COUNT 窗口形式

8i 起

聚合函数的分析函数用法,可在保留明细行的同时输出分组汇总与累计值。

语法aggregate(...) OVER (PARTITION BY ... ORDER BY ... [ROWS|RANGE frame])
使用要点

加了 ORDER BY 后默认是累计(RANGE UNBOUNDED PRECEDING TO CURRENT ROW);只看分组总量应省略 ORDER BY。

示例 SQL
SELECT ename, sal, SUM(sal) OVER (PARTITION BY deptno ORDER BY hiredate) cum_sal FROM emp;
示例结果按入职顺序累计部门薪资

RATIO_TO_REPORT

8i 起

返回当前值占分区(或全体)总和的比例。

语法RATIO_TO_REPORT(expr) OVER ([PARTITION BY ...])
使用要点

做占比分析很省事,等价于 expr/SUM(expr) OVER (...)。

示例 SQL
SELECT ename, sal, ROUND(RATIO_TO_REPORT(sal) OVER (), 4) pct FROM emp;
示例结果KING 5000 0.1723

PERCENT_RANK

8i 起

返回相对排名百分位,范围 0~1,公式为 (rank-1)/(n-1)。

语法PERCENT_RANK() OVER ([PARTITION BY ...] ORDER BY ...)
使用要点

每个分区的最小排序值返回 0;最大排序值若有并列,最高值的排名可能小于总行数,结果不一定为 1。

示例 SQL
SELECT ename, ROUND(PERCENT_RANK() OVER (ORDER BY sal), 3) pr FROM emp;
示例结果SMITH 0 / KING 1

CUME_DIST

8i 起

返回累积分布值,即小于等于当前值的行数占比(0~1)。

语法CUME_DIST() OVER ([PARTITION BY ...] ORDER BY ...)
使用要点

与 PERCENT_RANK 不同,最小值不为 0(如并列时约为 2/n)。

示例 SQL
SELECT ename, ROUND(CUME_DIST() OVER (ORDER BY sal), 3) cd FROM emp;
示例结果SMITH 0.071 ... KING 1

LISTAGG (分析形式)

11g R2 起

把 LISTAGG 作为分析函数使用,在明细行上直接展示所属分组的拼接结果。

语法LISTAGG(expr, delim) WITHIN GROUP (ORDER BY ...) OVER (PARTITION BY ...)
使用要点

可保留明细行,同时知道该分组拼接后的字符串。

示例 SQL
SELECT ename, deptno, LISTAGG(ename, '/') WITHIN GROUP (ORDER BY ename) OVER (PARTITION BY deptno) dept_names FROM emp;
示例结果每行附带本部门全部姓名

NULL 处理与条件函数

8 条

NVL

所有版本

若 expr1 为 NULL 则返回 expr2,否则返回 expr1。

语法NVL(expr1, expr2)
使用要点

两参数类型须兼容,否则 Oracle 会隐式转换,可能带来性能问题。

示例 SQL
SELECT NVL(comm, 0) FROM emp WHERE ename = 'SMITH';
示例结果0

NVL2

所有版本

expr1 非 NULL 返回 expr2,为 NULL 返回 expr3。

语法NVL2(expr1, expr2, expr3)
使用要点

相当于 CASE WHEN expr1 IS NOT NULL THEN expr2 ELSE expr3 END。

示例 SQL
SELECT ename, NVL2(comm, '有提成', '无提成') FROM emp;
示例结果SMITH 无提成 / ALLEN 有提成

NULLIF

所有版本

两值相等时返回 NULL,否则返回 expr1。

语法NULLIF(expr1, expr2)
使用要点

常用来把某些「占位值」转成真正的 NULL,例如 NULLIF(age, 0)。

示例 SQL
SELECT NULLIF(10, 10), NULLIF(10, 5) FROM dual;
示例结果(null) 10

COALESCE

所有版本

返回参数列表中第一个非 NULL 的值。

语法COALESCE(expr1, expr2, ...)
使用要点

比嵌套 NVL 更清晰,是 ANSI 标准函数;至少两个参数。

示例 SQL
SELECT COALESCE(NULL, NULL, 'C') FROM dual;
示例结果C

CASE

8i 起(9i 完全支持)

条件分支表达式,支持简单 CASE(等值比较)和搜索 CASE(任意条件)。

语法CASE [expr] WHEN ... THEN ... [ELSE ...] END
使用要点

SQL 中唯一的流程控制表达式;两个分支返回类型必须兼容。

示例 SQL
SELECT ename, CASE WHEN sal >= 3000 THEN '高' WHEN sal >= 1500 THEN '中' ELSE '低' END lvl FROM emp;
示例结果KING 高 / SMITH 低

DECODE

所有版本

Oracle 特有的条件匹配函数,expr 等于某 search 时返回对应 result,都不匹配返回 default。

语法DECODE(expr, search1, result1 [, search2, result2, ...] [, default])
使用要点

只能等值比较,不能写区间条件;DECODE 会把 NULL 视为相等,这是它与 CASE 的重要差异。

示例 SQL
SELECT ename, DECODE(deptno, 10, '财务部', 20, '研发部', 30, '销售部', '其他') FROM emp;
示例结果SMITH 研发部 / BLAKE 销售部

SYS_OP_C2C

内部函数

内部转换函数,用于在不同字符集之间转换字符串。

语法SYS_OP_C2C(char)
使用要点

属 Oracle 内部函数,不建议业务代码直接调用,正常用 TO_CHAR/NLS 参数即可。

示例 SQL
SELECT DUMP(SYS_OP_C2C(TO_CHAR(1))) FROM dual;
示例结果内部使用,返回转换后的字节

LNNVL

所有版本

当条件为 FALSE 或 UNKNOWN(含 NULL 比较)时返回 TRUE,否则返回 FALSE。

语法LNNVL(condition)
使用要点

用于在 NOT IN 等含 NULL 的场景中正确取反,避免三值逻辑误判。

示例 SQL
SELECT * FROM emp WHERE LNNVL(comm > 300);
示例结果返回 comm<=300 或 comm 为 NULL 的行

正则表达式函数

5 条

REGEXP_LIKE

10g 起

判断字符串是否匹配正则,可作为 WHERE 条件或 CHECK 约束。

语法REGEXP_LIKE(source, pattern [, match_param])
使用要点

match_param 可组合 'i' 忽略大小写、'c' 区分大小写、'n' 让 . 匹配换行、'm' 多行模式、'x' 忽略空白。

示例 SQL
SELECT ename FROM emp WHERE REGEXP_LIKE(ename, '^S', 'i');
示例结果SMITH / SCOTT

REGEXP_INSTR

10g 起

返回正则匹配的位置。

语法REGEXP_INSTR(source, pattern [, position [, occurrence [, return_option [, match_param [, subexpr]]]]])
使用要点

return_option=0 返回匹配起始位置,=1 返回匹配结束后位置;未匹配返回 0。

示例 SQL
SELECT REGEXP_INSTR('abc123def', '[0-9]+') FROM dual;
示例结果4

REGEXP_REPLACE

10g 起

按正则替换匹配内容,支持反向引用(如 \1)重组字符串。

语法REGEXP_REPLACE(source, pattern [, replace_string [, position [, occurrence [, match_param]]]])
使用要点

replace_string 省略时等价于删除匹配内容,是强大的清洗工具。

示例 SQL
SELECT REGEXP_REPLACE('138-1234-5678', '[^0-9]', '') FROM dual;
示例结果13812345678

REGEXP_COUNT

11g 起

返回正则匹配出现的次数。

语法REGEXP_COUNT(source, pattern [, position [, match_param]])
使用要点

11g 新增;统计关键词出现次数、校验并判断出现频次很方便。

示例 SQL
SELECT REGEXP_COUNT('a,b,c,d', ',') FROM dual;
示例结果3

REGEXP_SUBSTR (重复提取)

10g 起

配合 CONNECT BY LEVEL 可把一段文本按分隔符拆成多行,实现字符串切分。

语法REGEXP_SUBSTR(source, pattern, 1, LEVEL)
使用要点

经典写法:SELECT REGEXP_SUBSTR(str,'[^,]+',1,LEVEL) FROM dual CONNECT BY LEVEL <= REGEXP_COUNT(str,',')+1。

示例 SQL
SELECT REGEXP_SUBSTR('a,b,c', '[^,]+', 1, LEVEL) v FROM dual CONNECT BY LEVEL <= 3;
示例结果a / b / c(三行)

JSON 函数

10 条

JSON_VALUE

12c 起

从 JSON 文档中提取标量值(字符串、数字、布尔),返回 VARCHAR2(可 RETURNING 指定类型)。

语法JSON_VALUE(json_doc, path [RETURNING type] [ON ERROR|ON EMPTY ...])
使用要点

路径以 $ 开头,如 '$.name'、'$.items[0].price';只取单个标量值,取对象请用 JSON_QUERY。

示例 SQL
SELECT JSON_VALUE('{"name":"Tom","age":25}', '$.age' RETURNING NUMBER) FROM dual;
示例结果25

JSON_QUERY

12c 起

从 JSON 文档中提取对象或数组。

语法JSON_QUERY(json_doc, path [RETURNING type] [WITH|WITHOUT WRAPPER])
使用要点

默认 WITHOUT WRAPPER:匹配单个对象或数组时直接返回该值;匹配多个值时可显式使用 WITH WRAPPER 包成数组。

示例 SQL
SELECT JSON_QUERY('{"a":1,"b":{"c":2}}', '$.b') FROM dual;
示例结果{"c":2}

JSON_EXISTS

12c 起

判断 JSON 文档中是否存在指定路径。

语法JSON_EXISTS(json_doc, path [ON ERROR ...])
使用要点

可放在 WHERE 中过滤含某字段的行,也可用于条件约束。

示例 SQL
SELECT 1 FROM dual WHERE JSON_EXISTS('{"a":1}', '$.a');
示例结果1

JSON_TABLE

12c 起

把 JSON 数据按路径展开成关系型「虚拟表」,可在 FROM 子句中使用。

语法JSON_TABLE(json_doc, path COLUMNS (col type PATH '...', ...))
使用要点

处理 JSON 数组转行最常用的方式,可嵌套 COLUMNS 处理子数组。

示例 SQL
SELECT * FROM JSON_TABLE('[{"id":1},{"id":2}]', '$[*]' COLUMNS (id NUMBER PATH '$.id'));
示例结果id: 1 / 2(两行)

JSON_OBJECT

12c 起

由键值对构造 JSON 对象。

语法JSON_OBJECT(key VALUE value, ... [ABSENT ON NULL|NULL ON NULL])
使用要点

12c 用 KEY...VALUE 语法,19c 起支持更简洁的 KEY:VALUE 写法;NULL ON NULL 会输出 null。

示例 SQL
SELECT JSON_OBJECT('name' VALUE ename, 'sal' VALUE sal) FROM emp WHERE rownum = 1;
示例结果{"name":"SMITH","sal":800}

JSON_ARRAY

12c 起

构造 JSON 数组。

语法JSON_ARRAY(expr, ... [NULL|ABSENT ON NULL] [RETURNING type])
使用要点

默认 ABSENT ON NULL(NULL 元素不输出),可显式指定 NULL ON NULL。

示例 SQL
SELECT JSON_ARRAY(1, 2, 'x') FROM dual;
示例结果[1,2,"x"]

JSON_ARRAYAGG

12c 起

聚合函数:把多行值聚合成一个 JSON 数组。

语法JSON_ARRAYAGG(expr [ORDER BY ...] [NULL|ABSENT ON NULL] [RETURNING type])
使用要点

12c R2(12.2)已支持在 JSON_ARRAYAGG 内使用 ORDER BY 控制元素顺序;常与 JSON_OBJECT 嵌套构造结构。

示例 SQL
SELECT JSON_ARRAYAGG(ename ORDER BY ename) FROM emp WHERE deptno = 10;
示例结果["CLARK","KING","MILLER"]

JSON_OBJECTAGG

12c 起

聚合函数:把多行的键值对聚合成一个 JSON 对象。

语法JSON_OBJECTAGG(key_expr VALUE value_expr [NULL|ABSENT ON NULL])
使用要点

返回文本 JSON 时,默认不检查重复键;需要拒绝重复键可指定 WITH UNIQUE KEYS。使用重复键会让后续读取结果不可靠。

示例 SQL
SELECT JSON_OBJECTAGG(ename VALUE sal) FROM emp WHERE deptno = 10;
示例结果{"CLARK":2450,"KING":5000,"MILLER":1300}

JSON_SERIALIZE

12c 起

把 JSON 类型数据序列化为文本输出。

语法JSON_SERIALIZE(expr [RETURNING type] [PRETTY])
使用要点

12c 起可用;19c/21c 中 JSON 类型的互操作更完整,PRETTY 可格式化美化输出。

示例 SQL
SELECT JSON_SERIALIZE(JSON_OBJECT('a' VALUE 1) PRETTY) FROM dual;
示例结果{ "a" : 1 }

JSON_DATAGUIDE / JSON_MERGEPATCH

12c/19c

JSON_MERGEPATCH 按 RFC 7396 合并两个 JSON(补丁更新);JSON_DATAGUIDE 生成数据的结构摘要。

语法JSON_MERGEPATCH(target, patch) | JSON_DATAGUIDE(expr)
使用要点

JSON_MERGEPATCH 在 19c 中成为 SQL 函数,可用于局部更新 JSON 字段。

示例 SQL
SELECT JSON_MERGEPATCH('{"a":1,"b":2}', '{"b":3}') FROM dual;
示例结果{"a":1,"b":3}

XML 函数

12 条

XMLELEMENT

9i 起

构造一个 XML 元素节点。

语法XMLELEMENT(identifier, xmlattributes(...), expr, ...)
使用要点

常与 XMLAGG、XMLFOREST 组合生成 XML 报表;属性用 XMLATTRIBUTES 指定。

示例 SQL
SELECT XMLELEMENT("emp", ename) FROM emp WHERE rownum = 1;
示例结果<emp>SMITH</emp>

XMLFOREST

9i 起

把多个表达式构造成一组平级的 XML 元素。

语法XMLFOREST(value [AS alias], ...)
使用要点

适合把一行记录转成若干标签,避免逐个 XMLELEMENT 嵌套。

示例 SQL
SELECT XMLFOREST(ename AS n, sal AS s) FROM emp WHERE rownum = 1;
示例结果<N>SMITH</N><S>800</S>

XMLATTRIBUTES

9i 起

为 XML 元素生成属性,必须作为 XMLELEMENT 的第一个参数。

语法XMLATTRIBUTES(value [AS alias], ...)
使用要点

属性名默认取表达式别名,无别名时取列名。

示例 SQL
SELECT XMLELEMENT("emp", XMLATTRIBUTES(empno AS id), ename) FROM emp WHERE rownum = 1;
示例结果<emp id="7369">SMITH</emp>

XMLAGG

9i 起

聚合函数:把多行的 XML 片段拼接成一个 XML 文档。

语法XMLAGG(XMLType_instance [ORDER BY ...])
使用要点

是 XML 版的 LISTAGG,非常适合超长文本拼接(不受 4000 字节限制),常用于 Oracle 生成 CSV/HTML 报表。

示例 SQL
SELECT XMLAGG(XMLELEMENT("e", ename || ',') ORDER BY ename) FROM emp;
示例结果<e>ADAMS,</e><e>ALLEN,</e>...

XMLPARSE

9i 起

把字符串解析为 XMLType。

语法XMLPARSE({DOCUMENT|CONTENT} value [WELLFORMED])
使用要点

DOCUMENT 要求有唯一根节点;CONTENT 允许片段。

示例 SQL
SELECT XMLPARSE(DOCUMENT '<a>1</a>') FROM dual;
示例结果XMLType 值

XMLSERIALIZE

9i 起

把 XMLType 序列化为字符串(VARCHAR2/CLOB)。

语法XMLSERIALIZE({CONTENT|DOCUMENT} expr AS type [NO INDENT])
使用要点

调试 XML 输出时很实用;省略缩进子句时是否美化输出不确定,需要稳定格式应显式指定 INDENT SIZE 或 NO INDENT。

示例 SQL
SELECT XMLSERIALIZE(CONTENT XMLELEMENT("a", 1) AS VARCHAR2(100)) FROM dual;
示例结果<a>1</a>

EXTRACTVALUE / EXTRACT (XML)

9i 起(EXTRACTVALUE 10g 起废弃)

按 XPath 从 XMLType 中提取标量值或节点。

语法EXTRACTVALUE(xmltype, xpath) | EXTRACT(xmltype, xpath)
使用要点

EXTRACTVALUE 返回标量文本(已废弃,推荐 XMLQUERY + XMLTABLE);EXTRACT 返回 XMLType 节点。

示例 SQL
SELECT EXTRACTVALUE(XMLPARSE(DOCUMENT '<a><b>7</b></a>'), '/a/b') FROM dual;
示例结果7

XMLQUERY

10g 起

执行 XQuery 表达式并返回 XMLType 结果。

语法XMLQUERY(xquery_string PASSING xmltype RETURNING CONTENT [NULL ON EMPTY])
使用要点

是 EXTRACT/EXTRACTVALUE 的官方替代;配合 XMLSERIALIZE 或 XMLTABLE 使用。

示例 SQL
SELECT XMLSERIALIZE(CONTENT XMLQUERY('/a/b' PASSING XMLPARSE(DOCUMENT '<a><b>7</b></a>') RETURNING CONTENT) AS VARCHAR2(20)) FROM dual;
示例结果<b>7</b>

XMLTABLE

10g 起

把 XML 数据按 XPath 展开成关系表,可在 FROM 中直接查询。

语法XMLTABLE(xquery [PASSING ...] COLUMNS col type PATH '...')
使用要点

处理 XML 报文入库、把嵌套 XML 转成多行记录的首选方式。

示例 SQL
SELECT t.v FROM XMLTABLE('/r/i' PASSING XMLPARSE(DOCUMENT '<r><i>a</i><i>b</i></r>') COLUMNS v VARCHAR2(10) PATH '.') t;
示例结果a / b(两行)

XMLCAST

10g 起

把 XML 值转换成指定的 SQL 标量类型;Oracle 不支持用 XMLCAST 反向把 SQL 标量转换成 XML。

语法XMLCAST(expr AS datatype)
使用要点

XMLTABLE/XMLQUERY 结果转具体类型时使用。

示例 SQL
SELECT XMLCAST(XMLQUERY('/a/b' PASSING XMLPARSE(DOCUMENT '<a><b>7</b></a>') RETURNING CONTENT) AS NUMBER) FROM dual;
示例结果7

SYS_XMLGEN / SYS_XMLAGG

9i 起

根据表达式(对象类型或标量)自动生成 XML 文档;XMLAGG 的封装版。

语法SYS_XMLGEN(expr) | SYS_XMLAGG(expr)
使用要点

适合快速把查询结果转 XML,输出结构由 Oracle 规则决定,可控性弱于手动构造。

示例 SQL
SELECT SYS_XMLGEN(ename) FROM emp WHERE rownum = 1;
示例结果<ENAME>SMITH</ENAME>

XMLCOLATTVAL

9i 起

生成带 name 属性的 XML 片段,便于标识字段来源。

语法XMLCOLATTVAL(value [AS alias], ...)
使用要点

输出形式如 <column name="ENAME">SMITH</column>。

示例 SQL
SELECT XMLCOLATTVAL(ename) FROM emp WHERE rownum = 1;
示例结果<column name="ENAME">SMITH</column>

编码/哈希/转换函数

13 条

ORA_HASH

所有版本

对表达式计算哈希值,可限定桶数量。

语法ORA_HASH(expr [, max_bucket] [, seed_value])
使用要点

常用来做数据分片、抽样、生成稳定伪随机分组;值稳定,同一输入结果一致。

示例 SQL
SELECT ORA_HASH('abc', 10) FROM dual;
示例结果6(0~10 之间的稳定值)

STANDARD_HASH

12c 起

按标准算法计算哈希,返回 RAW。

语法STANDARD_HASH(expr [, hash_method])
使用要点

hash_method 支持 SHA1(默认)、SHA256、SHA384、SHA512、MD5;适合做数据校验比对。

示例 SQL
SELECT STANDARD_HASH('abc', 'SHA256') FROM dual;
示例结果BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD

UTL_RAW.CAST_TO_VARCHAR2

8i 起(UTL_RAW 包)

把 RAW 值按字节重解释为 VARCHAR2。

语法UTL_RAW.CAST_TO_VARCHAR2(raw)
使用要点

不改变字节内容,只换类型解释;转换后需注意字符集正确性。

示例 SQL
SELECT UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('4F5241')) FROM dual;
示例结果ORA

UTL_ENCODE.BASE64_ENCODE

8i 起(UTL_ENCODE 包)

对二进制数据做 Base64 编码,返回 RAW。

语法UTL_ENCODE.BASE64_ENCODE(raw)
使用要点

编码结果需再经 UTL_RAW.CAST_TO_VARCHAR2 才能变成可读 Base64 字符串。

示例 SQL
SELECT UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('abc'))) FROM dual;
示例结果YWJj

UTL_ENCODE.BASE64_DECODE

8i 起(UTL_ENCODE 包)

对 Base64 编码的 RAW 数据解码。

语法UTL_ENCODE.BASE64_DECODE(raw_base64)
使用要点

解码后再 CAST_TO_VARCHAR2 得到原文。

示例 SQL
SELECT UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW('YWJj'))) FROM dual;
示例结果abc

UTL_URL.ESCAPE / UNESCAPE

8i 起(UTL_URL 包)

对 URL 中的特殊字符进行百分号编码 / 解码。

语法UTL_URL.ESCAPE(url [, escape_reserved_chars] [, url_charset]) | UTL_URL.UNESCAPE(url)
使用要点

UTL_URL.ESCAPE 和 UTL_URL.UNESCAPE 都是返回 VARCHAR2 的函数,用于 URL 百分号编码与解码;指定字符集时注意与目标系统一致。

示例 SQL
-- PL/SQL:TRUE 表示同时转义 URL 保留字符
DECLARE u VARCHAR2(200);
BEGIN
  u := UTL_URL.ESCAPE('a b&c', TRUE);
  DBMS_OUTPUT.PUT_LINE(u);
END;
/
示例结果a%20b%26c

DUMP

所有版本

返回表达式的数据类型、字节长度及内部字节表示。

语法DUMP(expr [, return_fmt [, start_position [, length]]])
使用要点

排查字符集、乱码、隐式转换问题时非常有用;return_fmt 8/10/16 控制进制。

示例 SQL
SELECT DUMP('AB', 16) FROM dual;
示例结果Typ=96 Len=2: 41,42

VSIZE

所有版本

返回表达式内部表示的字节数。

语法VSIZE(expr)
使用要点

与 LENGTHB 类似但作用于任意类型;对 NUMBER 返回其内部存储字节数。

示例 SQL
SELECT VSIZE('AB'), VSIZE(123) FROM dual;
示例结果2 3

ASCIISTR

9i 起

把字符串中的非 ASCII 字符转成 \xxxx 形式的 Unicode 转义表示。

语法ASCIISTR(char)
使用要点

用于定位乱码字符、生成与数据库字符集无关的字符串表示。

示例 SQL
SELECT ASCIISTR('中A') FROM dual;
示例结果\4E2DA

UNISTR

9i 起

把含 \xxxx 转义的字符串还原为 Unicode 字符。

语法UNISTR(char)
使用要点

与 ASCIISTR 互逆;可直接写 UNISTR('\4E2D') 得到「中」。

示例 SQL
SELECT UNISTR('\4E2D\6587') FROM dual;
示例结果中文

COMPOSE / DECOMPOSE

9i 起

COMPOSE 把 Unicode 分解式字符组合为合成式;DECOMPOSE 反向拆分。

语法COMPOSE(char) | DECOMPOSE(char)
使用要点

处理带重音符号的欧洲文字比较时有用;对中文无影响。

示例 SQL
SELECT COMPOSE(UNISTR('a\0301')) FROM dual;
示例结果á

NLSSORT / SCORE

所有版本

返回 SOUNDEX/CODEX 类排序的评分值,用于模糊匹配打分。

语法SCORE(expr)
使用要点

属冷门函数,实际模糊匹配更多用 UTL_MATCH 包。

示例 SQL
SELECT SCORE('abc') FROM dual;
示例结果0

UTL_MATCH.EDIT_DISTANCE

11g 起(UTL_MATCH 包)

计算两个字符串的编辑距离 / 相似度百分比(0~100)。

语法UTL_MATCH.EDIT_DISTANCE(s1, s2) | EDIT_DISTANCE_SIMILARITY(s1, s2)
使用要点

做姓名、地址模糊匹配时比 SOUNDEX 更准确。

示例 SQL
SELECT UTL_MATCH.EDIT_DISTANCE('oracle', 'oracl') , UTL_MATCH.EDIT_DISTANCE_SIMILARITY('oracle','oracl') FROM dual;
示例结果1 86

集合与杂项函数

19 条

USER

所有版本

返回当前会话的数据库用户名(大写)。

语法USER
使用要点

可与 SYS_CONTEXT('USERENV','SESSION_USER') 对比,后者可反映代理用户场景。

示例 SQL
SELECT USER FROM dual;
示例结果SCOTT

UID

所有版本

返回当前用户的数字 ID。

语法UID
使用要点

可用于审计或按用户区分数据;ID 在不同库中不通用。

示例 SQL
SELECT UID FROM dual;
示例结果54

SYS_CONTEXT

8i 起

返回应用上下文命名空间中的参数值。

语法SYS_CONTEXT('namespace', 'parameter' [, length])
使用要点

常用 'USERENV' 命名空间:SESSION_USER、CURRENT_SCHEMA、IP_ADDRESS、HOST、DB_NAME、SID 等,是审计与行级安全的关键函数。

示例 SQL
SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS'), SYS_CONTEXT('USERENV','DB_NAME') FROM dual;
示例结果192.168.1.10 ORCL

SYS_GUID

8i 起

生成一个 16 字节的全局唯一标识符(RAW 类型)。

语法SYS_GUID()
使用要点

常用于主键替代序列;要字符串形式用 RAWTOHEX(SYS_GUID())。

示例 SQL
SELECT RAWTOHEX(SYS_GUID()) FROM dual;
示例结果A1B2C3D4E5F60718293A4B5C6D7E8F90

DBMS_RANDOM

8i 起(DBMS_RANDOM 包)

生成随机数或随机字符串。

语法DBMS_RANDOM.VALUE [ (low, high) ] | DBMS_RANDOM.STRING(opt, len)
使用要点

VALUE 不带参返回 0~1 之间小数,带参返回 [low, high) 区间小数;取整数用 TRUNC(DBMS_RANDOM.VALUE(1,100))。需先 SEED 才可复现。

示例 SQL
SELECT TRUNC(DBMS_RANDOM.VALUE(1, 100)) FROM dual;
示例结果如 47

TABLE

8i 起

把集合类型(嵌套表/数组)当作表在 FROM 中展开成行。

语法TABLE(collection_expression)
使用要点

常与 COLLECT、SPLIT 拆分函数配合,实现数组到多行的转换。

示例 SQL
SELECT column_value FROM TABLE(sys.odcivarchar2list('a','b','c'));
示例结果a / b / c(三行)

CARDINALITY

8i 起

返回嵌套表中元素的数量。

语法CARDINALITY(nested_table)
使用要点

对 VARRAY 与嵌套表都有效;不适用于关联数组。

示例 SQL
SELECT CARDINALITY(sys.odcivarchar2list('a','b')) FROM dual;
示例结果2

SET / MULTISET

8i 起

集合运算:去重、并、交、差。

语法SET(collection) | expr MULTISET UNION|INTERSECT|EXCEPT expr
使用要点

如 SET(collect(...)) 去重,CAST(MULTISET(...) AS ...) 把子查询结果转为集合。

示例 SQL
SELECT CARDINALITY(SET(sys.odcivarchar2list('a','a','b'))) FROM dual;
示例结果2

TREAT

8i 起

把表达式按指定的对象类型(或子类型)处理,用于对象类型继承场景。

语法TREAT(expr AS type)
使用要点

仅在对象关系特性中使用,普通业务表很少涉及。

示例 SQL
SELECT TREAT(VALUE(t) AS student_typ).major FROM t;
示例结果返回子类型属性值

VALUE

8i 起

返回对象表中的对象实例。

语法VALUE(table_alias)
使用要点

配合对象类型表使用;普通关系表无需。

示例 SQL
SELECT VALUE(t) FROM t;
示例结果对象实例

REF

8i 起

返回对象行的引用(指向行对象的指针)。

语法REF(table_alias)
使用要点

对象关系特性的组成部分,非对象表不可用。

示例 SQL
SELECT REF(t) FROM t;
示例结果对象引用值

EMPTY_CLOB / EMPTY_BLOB

8i 起

返回空的 LOB 定位器,用于 INSERT/UPDATE 初始化 LOB 列。

语法EMPTY_CLOB() | EMPTY_BLOB()
使用要点

初始化后才能用 DBMS_LOB 写入数据;直接赋值 NULL 会导致后续 LOB 操作失败。

示例 SQL
INSERT INTO t(id, content) VALUES (1, EMPTY_CLOB());
示例结果插入 1 行(CLOB 为空定位器)

DBMS_LOB.GETLENGTH

8i 起

返回 LOB 字段的字符/字节长度。

语法DBMS_LOB.GETLENGTH(lob_loc)
使用要点

CLOB 返回字符数,BLOB 返回字节数;SQL 的 LENGTH 也支持 CLOB,选择 DBMS_LOB.GETLENGTH 主要是为了统一处理 LOB 类型。

示例 SQL
SELECT DBMS_LOB.GETLENGTH(content) FROM t WHERE id = 1;
示例结果1024

DBMS_LOB.SUBSTR

8i 起

从 LOB 中截取子串(支持 CLOB 与 BLOB)。

语法DBMS_LOB.SUBSTR(lob_loc, amount, offset)
使用要点

CLOB 最多返回 32767 字符,BLOB 最多 32767 字节;是处理大文本的必备函数。

示例 SQL
SELECT DBMS_LOB.SUBSTR(content, 100, 1) FROM t WHERE id = 1;
示例结果前 100 个字符

CHARTOROWID / ROWID 系列

8i 起

DBMS_ROWID 包用于解析 ROWID 的结构信息(对象号、文件号、块号、行号)。

语法DBMS_ROWID.ROWID_TYPE(rowid) 等
使用要点

排查数据损坏、定位物理存储位置时使用,日常开发几乎用不到。

示例 SQL
SELECT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) FROM emp WHERE rownum = 1;
示例结果394

DUAL 表

所有版本

系统单行单列表,用于计算表达式、调用函数或获取序列值。

语法SELECT ... FROM dual
使用要点

不是函数但必须掌握:查询常量、调用 SYSDATE/SYS_GUID、序列 NEXTVAL 都依赖它。

示例 SQL
SELECT 1 + 1 FROM dual;
示例结果2

ROWNUM / ROWID 伪列

所有版本

ROWNUM 是结果集行号(在 ORDER BY 之前分配);ROWID 是行的物理地址。

语法ROWNUM | ROWID
使用要点

分页经典陷阱:WHERE ROWNUM <= 10 可行,但 ORDER BY 后再取 ROWNUM 需嵌套子查询,否则顺序不对。

示例 SQL
SELECT * FROM (SELECT ename, sal FROM emp ORDER BY sal DESC) WHERE ROWNUM <= 3;
示例结果薪资前 3 名

CONNECT_BY_ROOT / LEVEL / SYS_CONNECT_BY_PATH

9i 起

层级查询专用:LEVEL 为层号,CONNECT_BY_ROOT 取根节点列值,SYS_CONNECT_BY_PATH 生成从根到当前节点的路径串。

语法CONNECT_BY_ROOT col | LEVEL | SYS_CONNECT_BY_PATH(col, '/')
使用要点

配合 START WITH ... CONNECT BY PRIOR ... 使用,是组织架构、BOM、树状分类查询的核心。

示例 SQL
SELECT LEVEL, ename, SYS_CONNECT_BY_PATH(ename, '/') path FROM emp START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr;
示例结果1 KING /KING,2 JONES /KING/JONES ...

NVL 系列(补充说明)

8i 起

本类别还包含 SYS_CONTEXT 的自定义命名空间(CREATE CONTEXT)、DBMS_SESSION 等,属于会话与环境管理范畴。

语法—
使用要点

自定义上下文需 DBA 授权 CREATE ANY CONTEXT,用于实现行级安全(VPD)。

示例 SQL
SELECT SYS_CONTEXT('MY_CTX', 'TENANT_ID') FROM dual;
示例结果当前会话的租户标识