ASCII
所有版本返回指定字符的 ASCII 码值。若传入字符串,只取第一个字符。
ASCII(char)与 CHR 互为逆函数;传入 NULL 返回 NULL。
SELECT ASCII('A') FROM dual;ORACLE / REFERENCE
函数、表达式与相关语法按主题收录。179 是知识条目数,其中包含补充说明,并非不同函数的数量。
返回指定字符的 ASCII 码值。若传入字符串,只取第一个字符。
ASCII(char)与 CHR 互为逆函数;传入 NULL 返回 NULL。
SELECT ASCII('A') FROM dual;返回数据库字符集中与整数 n 对应的字符。
CHR(n [USING NCHAR_CS])n 按数据库字符集(或 USING NCHAR_CS 指定的国家字符集)的字符编码解释;多字节字符须传入完整编码值,不能一概当作 Unicode 码点。CHR(10) 常用于换行,CHR(9) 常用于制表。
SELECT CHR(65) || CHR(66) FROM dual;把 char2 拼接到 char1 之后,等同于 || 运算符。
CONCAT(char1, char2)只支持两个参数;要连多个串请用 || 或嵌套。
SELECT CONCAT('Hello', ' World') FROM dual;将字符串中每个单词的首字母转为大写,其余字母转为小写。
INITCAP(char)以空格或非字母数字字符作为单词分隔。
SELECT INITCAP('hello world oracle') FROM dual;将字符串全部转换为小写。
LOWER(char)常用于忽略大小写的比较;LOWER 与 UPPER 互为反向。
SELECT LOWER('ORACLE SQL') FROM dual;将字符串全部转换为大写。
UPPER(char)索引列上使用会导致索引失效(除非建了函数索引),大表过滤慎用。
SELECT UPPER('oracle sql') FROM dual;按指定排序规则做首字母大写转换,可处理特殊语言的大小写规则。
NLS_INITCAP(char [, 'nlsparam'])nlsparam 形如 'NLS_SORT=XGERMAN';一般场景直接用 INITCAP 即可。
SELECT NLS_INITCAP('ijsland', 'NLS_SORT=XDutch') FROM dual;演示大小写函数可嵌套组合使用。
LOWER(UPPER(char))嵌套无实际增益,仅作演示;实际写一层即可。
SELECT LOWER(UPPER('Oracle')) FROM dual;在字符串左侧填充字符,使其达到长度 n。
LPAD(expr1, n [, expr2])expr2 默认空格;若 n 小于原串长度,则从左侧截断到 n 位,这是格式化输出的常用技巧。
SELECT LPAD('7', 3, '0') FROM dual;在字符串右侧填充字符,使其达到长度 n。
RPAD(expr1, n [, expr2])与 LPAD 对称;n 小于原串长度时从右侧截断。
SELECT RPAD('abc', 6, '*') FROM dual;从字符串左侧删除出现在 set 中的所有字符,直到遇到不在 set 中的字符为止。
LTRIM(char [, set])set 是按“字符集合”而非“字符串”匹配的;不写 set 默认去左侧空格。
SELECT LTRIM('xxxyxOracle', 'xy') FROM dual;从字符串右侧删除出现在 set 中的所有字符。
RTRIM(char [, set])set 同样是字符集合语义,不是去后缀字符串。要去指定后缀请用 REGEXP_REPLACE。
SELECT RTRIM('Oraclexxyxx', 'xy') FROM dual;按指定方向去除首尾字符,默认去除两端空格。
TRIM([ {LEADING|TRAILING|BOTH} trim_char FROM] char)TRIM 一次只能指定一个 trim_char;TRIM(char) 仅接受单参数去空格形式。
SELECT TRIM(BOTH '*' FROM '**Oracle**') FROM dual;将字符串中所有 search_string 替换为 replacement_string。
REPLACE(char, search_string [, replacement_string])replacement_string 省略时等价于删除 search_string;search_string 为空则原样返回。
SELECT REPLACE('abcabc', 'b', 'X') FROM dual;按字符逐一映射替换:from_string 中第 i 个字符替换为 to_string 中第 i 个字符。
TRANSLATE(expr, from_string, to_string)与 REPLACE 不同,TRANSLATE 是单字符级映射。to_string 为空字符串时在 Oracle 中视为 NULL,结果也为 NULL;要删除字符,可在 from_string 前加一个保留字符,并只把该字符写入 to_string。
SELECT TRANSLATE('2KRW229', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') FROM dual;从 position 位置起截取指定长度的子串。
SUBSTR(char, position [, substring_length])position 为正从左数、为负从右数;position=0 视为 1;省略长度则截到末尾。
SELECT SUBSTR('Oracle SQL', 8, 3) FROM dual;按字节而非字符截取子串。
SUBSTRB(char, position [, length])多字节字符集(如 UTF-8 中文占 3 字节)下按字节切可能截断半个汉字,产生乱码。
SELECT SUBSTRB('ABCDE', 2, 3) FROM dual;返回 substring 在 string 中首次出现的位置(从 1 开始)。
INSTR(string, substring [, position [, occurrence]])position 为负表示从右往左搜索;occurrence 指定第几次出现;未找到返回 0。
SELECT INSTR('Oracle SQL SQL', 'SQL', 1, 2) FROM dual;与 INSTR 相同,但返回的是字节位置而非字符位置。
INSTRB(string, substring [, position [, occurrence]])多字节字符集下返回值会大于 INSTR。
SELECT INSTRB('ABCABC', 'B') FROM dual;返回字符串的字符个数。
LENGTH(char)中文在 UTF-8 下算 1 个字符;要算字节数用 LENGTHB。
SELECT LENGTH('Oracle') FROM dual;返回字符串占用的字节数。
LENGTHB(char)数据库字符集为 AL32UTF8 时,一个汉字通常占 3 字节,可用于校验字段长度是否超限。
SELECT LENGTHB('Oracle') FROM dual;按正则表达式从字符串中提取匹配的子串。
REGEXP_SUBSTR(source, pattern [, position [, occurrence [, match_param [, subexpr]]]])occurrence 指定取第几个匹配;subexpr 取捕获组(0 表示整个匹配)。
SELECT REGEXP_SUBSTR('aaa,bbb,ccc', '[^,]+', 1, 2) FROM dual;返回字符串的语音表示,用于按英文发音做模糊匹配。
SOUNDEX(char)源自英文发音规则,对中文无效;长度固定为 4 位。
SELECT SOUNDEX('Smith'), SOUNDEX('Smyth') FROM dual;返回字符串的排序键值,让排序遵循指定语言的排序规则。
NLSSORT(char [, 'nlsparam'])常写作 ORDER BY NLSSORT(name,'NLS_SORT=SCHINESE_PINYIN_M') 实现中文按拼音排序。
SELECT * FROM t ORDER BY NLSSORT(name, 'NLS_SORT=SCHINESE_PINYIN_M');早期版本的字符串聚合函数,把分组内的值用逗号拼接成一个字符串。
WM_CONCAT(expr)非官方文档函数,12c 起已移除,请改用 LISTAGG。
SELECT deptno, WM_CONCAT(ename) FROM emp GROUP BY deptno;返回数值的绝对值。
ABS(n)对 NULL 返回 NULL。
SELECT ABS(-12.5) FROM dual;向上取整,返回大于等于 n 的最小整数。
CEIL(n)与 FLOOR 相对;对负数 CEIL(-1.5) = -1。
SELECT CEIL(3.1), CEIL(-3.1) FROM dual;向下取整,返回小于等于 n 的最大整数。
FLOOR(n)FLOOR(-3.1) = -4,注意负数方向。
SELECT FLOOR(3.9), FLOOR(-3.1) FROM dual;按指定小数位四舍五入。
ROUND(n [, integer])第二个参数可为负,表示对整数位四舍五入,如 ROUND(1234,-2)=1200。
SELECT ROUND(3.14159, 2), ROUND(1234.5, -2) FROM dual;按指定小数位截断,不进行舍入;也用于日期截断。
TRUNC(n [, integer])TRUNC(3.99,0)=3,直接丢弃;负数位截断整数部分。
SELECT TRUNC(3.99), TRUNC(1234.5678, 2) FROM dual;返回 n2 除以 n1 的余数。
MOD(n2, n1)n1 为 0 时返回 n2;符号与被除数一致。常用于奇偶判断、分片路由。
SELECT MOD(10, 3) FROM dual;返回 n2 除以 n1 的余数,但采用舍入到最近整数的方式(IEEE 余数)。
REMAINDER(n2, n1)与 MOD 的差别在 .5 边界:REMAINDER(5,2)=1,而 MOD(5,2)=1;REMAINDER(3,2)=-1。
SELECT REMAINDER(3, 2), MOD(3, 2) FROM dual;返回 n2 的 n1 次幂。
POWER(n2, n1)n1 可为小数,用于开方等运算。
SELECT POWER(2, 10) FROM dual;返回 n 的平方根。
SQRT(n)n 为负数时报错 ORA-01428。
SELECT SQRT(144) FROM dual;返回 e 的 n 次幂(自然指数)。
EXP(n)与 LN 互为逆运算,常用于复利、增长模型计算。
SELECT ROUND(EXP(1), 5) FROM dual;返回 n 的自然对数(以 e 为底)。
LN(n)n 必须大于 0,否则报错。
SELECT ROUND(LN(10), 5) FROM dual;返回以 n2 为底 n1 的对数。
LOG(n2, n1)LOG(10, 100) = 2;底数不能为 1 或负数。
SELECT LOG(10, 1000) FROM dual;返回 n 的符号:正数返回 1,负数返回 -1,0 返回 0。
SIGN(n)常用来在排序或条件判断中区分正负。
SELECT SIGN(-8), SIGN(0), SIGN(8) FROM dual;两个数值按位与运算。
BITAND(expr1, expr2)Oracle 早期没有独立位运算符,常用 BITAND 配合实现位标志位判断,如判断权限位。
SELECT BITAND(6, 3) FROM dual;返回参数列表中的最大值。
GREATEST(expr1, expr2, ...)可混合数字与字符串,但会比较规则可能导致意外;任一参数为 NULL 时结果通常为 NULL。
SELECT GREATEST(10, 25, 7) FROM dual;返回参数列表中的最小值。
LEAST(expr1, expr2, ...)与 GREATEST 相对;注意 NULL 传播特性。
SELECT LEAST(10, 25, 7) FROM dual;将数值按等宽区间分桶,返回所属桶编号(从 1 开始;越界返回 0 或 num_buckets+1)。
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)常用于制作数值分布直方图、分段统计。
SELECT WIDTH_BUCKET(85, 0, 100, 5) FROM dual;若 n1 为 NaN(非数字)则返回 n2,否则返回 n1。
NANVL(n1, n2)针对 BINARY_FLOAT/BINARY_DOUBLE 的专用函数,对普通 NUMBER 无意义。
SELECT NANVL(BINARY_DOUBLE_NAN, 0) FROM dual;把字符串按格式转换为数字。
TO_NUMBER(expr [, format [, nlsparam]])用 '9' 占位数字、'0' 强制补零、'$' 货币符、'S' 正负号等;转换失败报 ORA-01722。
SELECT TO_NUMBER('$1,234.56', '$9,999.99') FROM dual;返回数据库服务器当前日期时间,精度到秒。
SYSDATE无参数、无需 FROM dual 也可用;不带时区信息,客户端时区不影响它。
SELECT SYSDATE FROM dual;返回数据库服务器当前时间戳,含时区与小数秒(TIMESTAMP WITH TIME ZONE)。
SYSTIMESTAMP精度取决于平台,通常为毫秒/微秒级;跨时区系统建议用它。
SELECT SYSTIMESTAMP FROM dual;返回当前会话时区下的日期时间。
CURRENT_DATE与 SYSDATE 的区别是会话时区,可用于跨时区应用。
SELECT CURRENT_DATE FROM dual;返回当前会话时区下的时间戳(含时区)。
CURRENT_TIMESTAMP [ (precision) ]带小数秒精度参数可选,如 CURRENT_TIMESTAMP(3)。
SELECT CURRENT_TIMESTAMP(3) FROM dual;返回当前会话时区的本地时间戳,不含时区信息。
LOCALTIMESTAMP [ (precision) ]适合存入 TIMESTAMP 字段而不想带时区的场景。
SELECT LOCALTIMESTAMP FROM dual;返回数据库时区名称。
DBTIMEZONE只读,修改需用 ALTER DATABASE SET TIME_ZONE。
SELECT DBTIMEZONE FROM dual;返回当前会话的时区。
SESSIONTIMEZONE可通过 ALTER SESSION SET TIME_ZONE 临时修改。
SELECT SESSIONTIMEZONE FROM dual;在日期上增加 n 个月,n 可为负数。
ADD_MONTHS(date, n)会自动处理月末对齐:ADD_MONTHS('2026-01-31',1) = 2026-02-28(该年 2 月无 31 日)。
SELECT ADD_MONTHS(DATE '2026-01-31', 1) FROM dual;返回 date1 与 date2 之间的月数。
MONTHS_BETWEEN(date1, date2)两日若同为月末则返回整数;否则按 31 天一月折算,可能出现小数(如 1.03225806)。
SELECT MONTHS_BETWEEN(SYSDATE, DATE '2026-01-01') FROM dual;返回该日期所在月份的最后一天。
LAST_DAY(date)做月度报表统计时非常常用,返回带时分秒的日期。
SELECT LAST_DAY(DATE '2026-02-15') FROM dual;返回 date 之后的下一个指定星期几的日期。
NEXT_DAY(date, char)char 受会话 NLS_LANGUAGE 影响(中文环境可写 '星期一'),也可用数字 1=周日。
SELECT NEXT_DAY(DATE '2026-09-22', '星期五') FROM dual;按指定精度把日期截断到起点。
TRUNC(date [, fmt])常用格式:'YYYY' 年初、'MM' 月初、'DD' 当天零点、'HH' 整点、'Q' 季初、'IW' 本周周一。
SELECT TRUNC(SYSDATE, 'MM') FROM dual;按指定精度对日期四舍五入。
ROUND(date [, fmt])ROUND(SYSDATE,'MM') 以每月 16 日为界,15 日及之前回到月初,16 日及之后进到次月初。
SELECT ROUND(DATE '2026-09-20', 'MM') FROM dual;从日期或时间戳中提取年、月、日、时、分、秒等字段。
EXTRACT(fmt FROM expr)fmt 可为 YEAR/MONTH/DAY/HOUR/MINUTE/SECOND/TIMEZONE_HOUR/YEAR TO MONTH 等。
SELECT EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE) FROM dual;把日期按格式模型转成字符串。
TO_CHAR(date [, fmt [, nlsparam]])DATE 常用模型:YYYY 年、MM 月、DD 日、HH24 24小时、MI 分、SS 秒、DY 星期缩写、DAY 星期全称、MON 月份缩写、Q 季度、DDD 年内天数、IW 周数;FF3 毫秒仅适用于 TIMESTAMP 等支持小数秒的类型。
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;把字符串按格式模型解析为日期。
TO_DATE(char [, fmt [, nlsparam]])强烈建议显式写 fmt,否则依赖会话 NLS_DATE_FORMAT,易出现 ORA-01861 或错误解析。
SELECT TO_DATE('2026-09-22 09:30:00', 'YYYY-MM-DD HH24:MI:SS') FROM dual;把字符串转换为 TIMESTAMP 类型,支持小数秒。
TO_TIMESTAMP(char [, fmt])格式串中用 FF3/FF6 表示毫秒/微秒。
SELECT TO_TIMESTAMP('2026-09-22 09:30:00.123', 'YYYY-MM-DD HH24:MI:SS.FF3') FROM dual;把带时区信息的字符串转换为 TIMESTAMP WITH TIME ZONE。
TO_TIMESTAMP_TZ(char [, fmt])格式串需含 TZH:TZM,如 'YYYY-MM-DD HH24:MI:SS TZH:TZM'。
SELECT TO_TIMESTAMP_TZ('2026-09-22 09:30:00 +08:00', 'YYYY-MM-DD HH24:MI:SS TZH:TZM') FROM dual;把数字转换为 INTERVAL DAY TO SECOND 字面量。
NUMTODSINTERVAL(n, 'interval_unit')interval_unit 可为 DAY/HOUR/MINUTE/SECOND,用于做精确的加减。
SELECT SYSDATE + NUMTODSINTERVAL(90, 'MINUTE') FROM dual;把数字转换为 INTERVAL YEAR TO MONTH 字面量。
NUMTOYMINTERVAL(n, 'interval_unit')interval_unit 可为 YEAR 或 MONTH。
SELECT SYSDATE + NUMTOYMINTERVAL(3, 'MONTH') FROM dual;把日期从 zone1 时区转换到 zone2 时区。
NEW_TIME(date, zone1, zone2)zone 用缩写(AST/EST/GMT/PST 等),不支持夏令时自动调整,且缩写歧义较多,现在更推荐带时区的类型。
SELECT NEW_TIME(TO_DATE('2026-09-22 09:00:00','YYYY-MM-DD HH24:MI:SS'), 'GMT', 'EST') FROM dual;给一个 TIMESTAMP 附加时区信息,生成 TIMESTAMP WITH TIME ZONE。
FROM_TZ(timestamp, 'time_zone')常与 AT TIME ZONE 配合做时区换算。
SELECT FROM_TZ(TIMESTAMP '2026-09-22 09:00:00', '+08:00') FROM dual;把带时区的时间戳转换到另一个时区。
expr AT TIME ZONE zone用法示例:SYSTIMESTAMP AT TIME ZONE 'UTC'。
SELECT SYSTIMESTAMP AT TIME ZONE 'UTC' FROM dual;把带时区的时间戳转换为 UTC 时间。
SYS_EXTRACT_UTC(datetime_with_timezone)返回类型为 TIMESTAMP,不含时区。
SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) FROM dual;把表达式显式转换为指定数据类型,遵循 ANSI SQL 标准。
CAST(expr AS type_name)支持在大部分内置类型间转换;比 TO_CHAR 等更通用,但格式控制能力较弱。
SELECT CAST('123' AS NUMBER) + 1 FROM dual;把数字按格式模型转为字符串。
TO_CHAR(n [, fmt [, nlsparam]])常用模型:9 占位、0 补零、$ 货币、L 本地货币、. 小数点、, 千分位、FM 去首尾空格、MI 负号在后、EEEE 科学计数。
SELECT TO_CHAR(1234567.89, 'FM$9,999,999.00') FROM dual;把字符数据转换为 CLOB 大对象类型。
TO_CLOB(char)拼接超长文本(>4000 字节)时用它避免字符串长度限制。
SELECT TO_CLOB('很长的一段文本...') FROM dual;把 RAW 类型转换为 BLOB。
TO_BLOB(raw_value)常与 UTL_RAW 包配合处理二进制数据。
SELECT TO_BLOB(HEXTORAW('4F5241')) FROM dual;把 LONG 或 LONG RAW 列转换为 LOB 类型。
TO_LOB(long_column)只能用于 INSERT ... SELECT 中,不能直接出现在普通表达式里。
INSERT INTO t_new SELECT TO_LOB(long_col) FROM t_old;把单字节字符转换为对应的多字节(全角)字符。
TO_MULTI_BYTE(char)仅对字符集中存在对应全角形式的字符有效。
SELECT TO_MULTI_BYTE('ABC') FROM dual;把多字节(全角)字符转换为对应的单字节(半角)字符。
TO_SINGLE_BYTE(char)数据清洗中常用于把用户输入的全角数字、字母统一成半角。
SELECT TO_SINGLE_BYTE('ABC123') FROM dual;把十六进制字符串转换为 RAW 值。
HEXTORAW(char)字符串须为偶数个十六进制字符,否则报错。
SELECT HEXTORAW('4F5241') FROM dual;把 RAW 值转换为十六进制字符串。
RAWTOHEX(raw_value)与 HEXTORAW 互逆;可用于查看二进制内容。
SELECT RAWTOHEX(HEXTORAW('4F5241')) FROM dual;把 ROWID 伪列转换为字符串格式。
ROWIDTOCHAR(rowid)ROWID 定位单行最快,可作为去重、快速更新的依据。
SELECT ROWIDTOCHAR(ROWID) FROM emp WHERE rownum = 1;把字符串转换为 ROWID 类型。
CHARTOROWID(char)与 ROWIDTOCHAR 互逆。
SELECT CHARTOROWID('AAAESeAAEAAAAFyAAA') FROM dual;返回指向服务器端 BFILE 文件的定位器。
BFILENAME('directory', 'filename')需先 CREATE DIRECTORY 授权,然后再用 DBMS_LOB 读取。
SELECT BFILENAME('MYDIR', 'img.png') FROM dual;统计行数或非空值的个数。
COUNT({* | [DISTINCT|ALL] expr})COUNT(*) 统计所有行含 NULL;COUNT(col) 忽略 NULL;COUNT(DISTINCT col) 统计去重后的非空值。
SELECT COUNT(*), COUNT(comm), COUNT(DISTINCT deptno) FROM emp;对数值列求和,忽略 NULL。
SUM([DISTINCT|ALL] n)所有行都为 NULL 时返回 NULL 而非 0,展示层常需 NVL(SUM(x), 0)。
SELECT SUM(sal) FROM emp WHERE deptno = 10;计算平均值,忽略 NULL 行。
AVG([DISTINCT|ALL] n)注意分母是不为 NULL 的行数,而不是总行数。
SELECT ROUND(AVG(sal), 2) FROM emp WHERE deptno = 10;返回表达式的最小值,可用于数字、字符串、日期。
MIN([DISTINCT|ALL] expr)字符串按排序规则比较;NULL 被忽略。
SELECT MIN(hiredate), MIN(sal) FROM emp;返回表达式的最大值。
MAX([DISTINCT|ALL] expr)常用于取最新时间、最大编号;配合 KEEP DENSE_RANK 可实现组内取对应行。
SELECT MAX(sal) FROM emp;返回样本标准差(分母为 n-1)。
STDDEV([DISTINCT|ALL] n)衡量数据离散程度;只有一行非 NULL 数据时 STDDEV 返回 0,STDDEV_SAMP 才返回 NULL。
SELECT ROUND(STDDEV(sal), 2) FROM emp;返回总体标准差(分母为 n)。
STDDEV_POP(n)与 STDDEV 的区别在于分母;样本量即全体时用 POP 版。
SELECT ROUND(STDDEV_POP(sal), 2) FROM emp;返回样本方差(标准差的平方)。
VARIANCE([DISTINCT|ALL] n)与 STDDEV 配套使用。
SELECT ROUND(VARIANCE(sal), 2) FROM emp;返回总体方差。
VAR_POP(n)分母为 n,属于总体统计口径。
SELECT ROUND(VAR_POP(sal), 2) FROM emp;返回中位数。
MEDIAN(expr)对偶数行数会取中间两个值的平均;也可作为分析函数带 OVER 使用。
SELECT MEDIAN(sal) FROM emp;把分组内的值按指定顺序拼接成一个字符串(行转列)。
LISTAGG(measure_expr [, delimiter]) WITHIN GROUP (ORDER BY expr)结果为 VARCHAR2,11g 上限 4000 字节,超长报 ORA-01489;12c R2(12.2)起支持 ON OVERFLOW TRUNCATE 处理溢出。是 WM_CONCAT 的官方替代。
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) FROM emp GROUP BY deptno;12c 新增的溢出处理语法,避免拼接超长直接报错。
LISTAGG(... ON OVERFLOW {ERROR|TRUNCATE} [WITH COUNT]) WITHIN GROUP (...)TRUNCATE 会在超长时截断到允许长度,可加 WITH COUNT 显示被截断的条数。
SELECT LISTAGG(ename, ',' ON OVERFLOW TRUNCATE '...' WITH COUNT) WITHIN GROUP (ORDER BY ename) FROM emp;把一列值聚合成集合类型(嵌套表)。
COLLECT(column)常与 TABLE() 配合实现集合到行的展开;多用于 PL/SQL。
SELECT CAST(COLLECT(deptno) AS sys.odcinumberlist) FROM emp;配合 GROUP BY 的 ROLLUP/CUBE 使用,标识重复分组(值为 0 表示首次出现,>0 表示重复)。
GROUP_ID()用于在 ROLLUP 结果中去重重复的小计行。
SELECT deptno, job, GROUP_ID() FROM emp GROUP BY ROLLUP(deptno, job);判断某列是否参与了当前分组:参与返回 0,未参与(小计/合计行)返回 1。
GROUPING(expr)与 ROLLUP/CUBE 搭配,给汇总行打标记,配合 CASE 输出「小计」「合计」文字。
SELECT deptno, SUM(sal), GROUPING(deptno) FROM emp GROUP BY ROLLUP(deptno);返回各列 GROUPING 值组成的位向量对应的整数,便于一次判断多列汇总层级。
GROUPING_ID(expr1, expr2, ...)参数顺序与 GROUP BY 中列顺序一致。
SELECT deptno, job, GROUPING_ID(deptno, job) FROM emp GROUP BY ROLLUP(deptno, job);ROLLUP 生成逐级小计与合计;CUBE 生成所有维度组合;GROUPING SETS 精确指定需要哪些分组。
GROUP BY ROLLUP(a,b) | CUBE(a,b) | GROUPING SETS((a),(b))它们是 GROUP BY 的扩展而非函数,但必须与聚合函数配合,是制作多维报表的核心手段。
SELECT deptno, job, SUM(sal) FROM emp GROUP BY CUBE(deptno, job);在聚合时只取排序后第一/最后一名的行做聚合,可一次取出「最大值对应的那条记录的其他字段」。
aggregate KEEP (DENSE_RANK FIRST|LAST ORDER BY expr) [OVER (...)]经典用法:取每个部门薪资最高者的姓名,避免写自连接或子查询。
SELECT deptno, MAX(ename) KEEP (DENSE_RANK FIRST ORDER BY sal DESC) FROM emp GROUP BY deptno;为分区内每行生成连续唯一的序号。
ROW_NUMBER() OVER ([PARTITION BY ...] ORDER BY ...)相同排序值也会得到不同编号;去重时经典的 ROW_NUMBER()=1 取每组一条。
SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) rn FROM emp;按排序计算名次,相同值并列且占用后续序号(如 1,2,2,4)。
RANK() OVER ([PARTITION BY ...] ORDER BY ...)跳号特性适合「并列第几名」的展示;不跳号用 DENSE_RANK。
SELECT ename, sal, RANK() OVER (ORDER BY sal DESC) rk FROM emp;按排序计算名次,相同值并列且不跳号(如 1,2,2,3)。
DENSE_RANK() OVER ([PARTITION BY ...] ORDER BY ...)分组取 TOP-N(如每部门薪资前三)推荐用它,名次更紧凑。
SELECT ename, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) dr FROM emp;把分区内的行尽量平均分成 n 个桶,返回所在桶编号。
NTILE(n) OVER ([PARTITION BY ...] ORDER BY ...)常用于分位数分析、把数据均分为「高中低」几档。
SELECT ename, sal, NTILE(4) OVER (ORDER BY sal) quartile FROM emp;取当前行之前的第 offset 行的值(默认 1 行前)。
LAG(expr [, offset [, default]]) OVER (...)做环比、同比、前后对比的核心函数;第一行没有前行时返回 default(默认 NULL)。
SELECT sal, LAG(sal, 1, 0) OVER (ORDER BY hiredate) prev_sal FROM emp;取当前行之后的第 offset 行的值(默认 1 行后)。
LEAD(expr [, offset [, default]]) OVER (...)与 LAG 方向相反,常用于计算到下一笔记录的时间间隔。
SELECT hiredate, LEAD(hiredate) OVER (ORDER BY hiredate) next_hire FROM emp;返回窗口内第一行的值。
FIRST_VALUE(expr) OVER (...)常配合 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 实现累计或对比基准值。
SELECT sal, FIRST_VALUE(sal) OVER (ORDER BY sal DESC) max_sal FROM emp;返回窗口内最后一行的值。
LAST_VALUE(expr) OVER (...)默认窗口到当前行,所以直接写会返回当前行值;要取全局最后一行必须写 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。
SELECT sal, LAST_VALUE(sal) OVER (ORDER BY sal ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) max_sal FROM emp;返回窗口内第 n 行的值。
NTH_VALUE(expr, n) [FROM FIRST|LAST] OVER (...)n 超出行数返回 NULL;可指定从首端或末端计数。
SELECT sal, NTH_VALUE(sal, 2) FROM FIRST OVER (ORDER BY sal DESC) second_sal FROM emp;聚合函数的分析函数用法,可在保留明细行的同时输出分组汇总与累计值。
aggregate(...) OVER (PARTITION BY ... ORDER BY ... [ROWS|RANGE frame])加了 ORDER BY 后默认是累计(RANGE UNBOUNDED PRECEDING TO CURRENT ROW);只看分组总量应省略 ORDER BY。
SELECT ename, sal, SUM(sal) OVER (PARTITION BY deptno ORDER BY hiredate) cum_sal FROM emp;返回当前值占分区(或全体)总和的比例。
RATIO_TO_REPORT(expr) OVER ([PARTITION BY ...])做占比分析很省事,等价于 expr/SUM(expr) OVER (...)。
SELECT ename, sal, ROUND(RATIO_TO_REPORT(sal) OVER (), 4) pct FROM emp;返回相对排名百分位,范围 0~1,公式为 (rank-1)/(n-1)。
PERCENT_RANK() OVER ([PARTITION BY ...] ORDER BY ...)每个分区的最小排序值返回 0;最大排序值若有并列,最高值的排名可能小于总行数,结果不一定为 1。
SELECT ename, ROUND(PERCENT_RANK() OVER (ORDER BY sal), 3) pr FROM emp;返回累积分布值,即小于等于当前值的行数占比(0~1)。
CUME_DIST() OVER ([PARTITION BY ...] ORDER BY ...)与 PERCENT_RANK 不同,最小值不为 0(如并列时约为 2/n)。
SELECT ename, ROUND(CUME_DIST() OVER (ORDER BY sal), 3) cd FROM emp;把 LISTAGG 作为分析函数使用,在明细行上直接展示所属分组的拼接结果。
LISTAGG(expr, delim) WITHIN GROUP (ORDER BY ...) OVER (PARTITION BY ...)可保留明细行,同时知道该分组拼接后的字符串。
SELECT ename, deptno, LISTAGG(ename, '/') WITHIN GROUP (ORDER BY ename) OVER (PARTITION BY deptno) dept_names FROM emp;若 expr1 为 NULL 则返回 expr2,否则返回 expr1。
NVL(expr1, expr2)两参数类型须兼容,否则 Oracle 会隐式转换,可能带来性能问题。
SELECT NVL(comm, 0) FROM emp WHERE ename = 'SMITH';expr1 非 NULL 返回 expr2,为 NULL 返回 expr3。
NVL2(expr1, expr2, expr3)相当于 CASE WHEN expr1 IS NOT NULL THEN expr2 ELSE expr3 END。
SELECT ename, NVL2(comm, '有提成', '无提成') FROM emp;两值相等时返回 NULL,否则返回 expr1。
NULLIF(expr1, expr2)常用来把某些「占位值」转成真正的 NULL,例如 NULLIF(age, 0)。
SELECT NULLIF(10, 10), NULLIF(10, 5) FROM dual;返回参数列表中第一个非 NULL 的值。
COALESCE(expr1, expr2, ...)比嵌套 NVL 更清晰,是 ANSI 标准函数;至少两个参数。
SELECT COALESCE(NULL, NULL, 'C') FROM dual;条件分支表达式,支持简单 CASE(等值比较)和搜索 CASE(任意条件)。
CASE [expr] WHEN ... THEN ... [ELSE ...] ENDSQL 中唯一的流程控制表达式;两个分支返回类型必须兼容。
SELECT ename, CASE WHEN sal >= 3000 THEN '高' WHEN sal >= 1500 THEN '中' ELSE '低' END lvl FROM emp;Oracle 特有的条件匹配函数,expr 等于某 search 时返回对应 result,都不匹配返回 default。
DECODE(expr, search1, result1 [, search2, result2, ...] [, default])只能等值比较,不能写区间条件;DECODE 会把 NULL 视为相等,这是它与 CASE 的重要差异。
SELECT ename, DECODE(deptno, 10, '财务部', 20, '研发部', 30, '销售部', '其他') FROM emp;内部转换函数,用于在不同字符集之间转换字符串。
SYS_OP_C2C(char)属 Oracle 内部函数,不建议业务代码直接调用,正常用 TO_CHAR/NLS 参数即可。
SELECT DUMP(SYS_OP_C2C(TO_CHAR(1))) FROM dual;当条件为 FALSE 或 UNKNOWN(含 NULL 比较)时返回 TRUE,否则返回 FALSE。
LNNVL(condition)用于在 NOT IN 等含 NULL 的场景中正确取反,避免三值逻辑误判。
SELECT * FROM emp WHERE LNNVL(comm > 300);判断字符串是否匹配正则,可作为 WHERE 条件或 CHECK 约束。
REGEXP_LIKE(source, pattern [, match_param])match_param 可组合 'i' 忽略大小写、'c' 区分大小写、'n' 让 . 匹配换行、'm' 多行模式、'x' 忽略空白。
SELECT ename FROM emp WHERE REGEXP_LIKE(ename, '^S', 'i');返回正则匹配的位置。
REGEXP_INSTR(source, pattern [, position [, occurrence [, return_option [, match_param [, subexpr]]]]])return_option=0 返回匹配起始位置,=1 返回匹配结束后位置;未匹配返回 0。
SELECT REGEXP_INSTR('abc123def', '[0-9]+') FROM dual;按正则替换匹配内容,支持反向引用(如 \1)重组字符串。
REGEXP_REPLACE(source, pattern [, replace_string [, position [, occurrence [, match_param]]]])replace_string 省略时等价于删除匹配内容,是强大的清洗工具。
SELECT REGEXP_REPLACE('138-1234-5678', '[^0-9]', '') FROM dual;返回正则匹配出现的次数。
REGEXP_COUNT(source, pattern [, position [, match_param]])11g 新增;统计关键词出现次数、校验并判断出现频次很方便。
SELECT REGEXP_COUNT('a,b,c,d', ',') FROM dual;配合 CONNECT BY LEVEL 可把一段文本按分隔符拆成多行,实现字符串切分。
REGEXP_SUBSTR(source, pattern, 1, LEVEL)经典写法:SELECT REGEXP_SUBSTR(str,'[^,]+',1,LEVEL) FROM dual CONNECT BY LEVEL <= REGEXP_COUNT(str,',')+1。
SELECT REGEXP_SUBSTR('a,b,c', '[^,]+', 1, LEVEL) v FROM dual CONNECT BY LEVEL <= 3;从 JSON 文档中提取标量值(字符串、数字、布尔),返回 VARCHAR2(可 RETURNING 指定类型)。
JSON_VALUE(json_doc, path [RETURNING type] [ON ERROR|ON EMPTY ...])路径以 $ 开头,如 '$.name'、'$.items[0].price';只取单个标量值,取对象请用 JSON_QUERY。
SELECT JSON_VALUE('{"name":"Tom","age":25}', '$.age' RETURNING NUMBER) FROM dual;从 JSON 文档中提取对象或数组。
JSON_QUERY(json_doc, path [RETURNING type] [WITH|WITHOUT WRAPPER])默认 WITHOUT WRAPPER:匹配单个对象或数组时直接返回该值;匹配多个值时可显式使用 WITH WRAPPER 包成数组。
SELECT JSON_QUERY('{"a":1,"b":{"c":2}}', '$.b') FROM dual;判断 JSON 文档中是否存在指定路径。
JSON_EXISTS(json_doc, path [ON ERROR ...])可放在 WHERE 中过滤含某字段的行,也可用于条件约束。
SELECT 1 FROM dual WHERE JSON_EXISTS('{"a":1}', '$.a');把 JSON 数据按路径展开成关系型「虚拟表」,可在 FROM 子句中使用。
JSON_TABLE(json_doc, path COLUMNS (col type PATH '...', ...))处理 JSON 数组转行最常用的方式,可嵌套 COLUMNS 处理子数组。
SELECT * FROM JSON_TABLE('[{"id":1},{"id":2}]', '$[*]' COLUMNS (id NUMBER PATH '$.id'));由键值对构造 JSON 对象。
JSON_OBJECT(key VALUE value, ... [ABSENT ON NULL|NULL ON NULL])12c 用 KEY...VALUE 语法,19c 起支持更简洁的 KEY:VALUE 写法;NULL ON NULL 会输出 null。
SELECT JSON_OBJECT('name' VALUE ename, 'sal' VALUE sal) FROM emp WHERE rownum = 1;构造 JSON 数组。
JSON_ARRAY(expr, ... [NULL|ABSENT ON NULL] [RETURNING type])默认 ABSENT ON NULL(NULL 元素不输出),可显式指定 NULL ON NULL。
SELECT JSON_ARRAY(1, 2, 'x') FROM dual;聚合函数:把多行值聚合成一个 JSON 数组。
JSON_ARRAYAGG(expr [ORDER BY ...] [NULL|ABSENT ON NULL] [RETURNING type])12c R2(12.2)已支持在 JSON_ARRAYAGG 内使用 ORDER BY 控制元素顺序;常与 JSON_OBJECT 嵌套构造结构。
SELECT JSON_ARRAYAGG(ename ORDER BY ename) FROM emp WHERE deptno = 10;聚合函数:把多行的键值对聚合成一个 JSON 对象。
JSON_OBJECTAGG(key_expr VALUE value_expr [NULL|ABSENT ON NULL])返回文本 JSON 时,默认不检查重复键;需要拒绝重复键可指定 WITH UNIQUE KEYS。使用重复键会让后续读取结果不可靠。
SELECT JSON_OBJECTAGG(ename VALUE sal) FROM emp WHERE deptno = 10;把 JSON 类型数据序列化为文本输出。
JSON_SERIALIZE(expr [RETURNING type] [PRETTY])12c 起可用;19c/21c 中 JSON 类型的互操作更完整,PRETTY 可格式化美化输出。
SELECT JSON_SERIALIZE(JSON_OBJECT('a' VALUE 1) PRETTY) FROM dual;JSON_MERGEPATCH 按 RFC 7396 合并两个 JSON(补丁更新);JSON_DATAGUIDE 生成数据的结构摘要。
JSON_MERGEPATCH(target, patch) | JSON_DATAGUIDE(expr)JSON_MERGEPATCH 在 19c 中成为 SQL 函数,可用于局部更新 JSON 字段。
SELECT JSON_MERGEPATCH('{"a":1,"b":2}', '{"b":3}') FROM dual;构造一个 XML 元素节点。
XMLELEMENT(identifier, xmlattributes(...), expr, ...)常与 XMLAGG、XMLFOREST 组合生成 XML 报表;属性用 XMLATTRIBUTES 指定。
SELECT XMLELEMENT("emp", ename) FROM emp WHERE rownum = 1;把多个表达式构造成一组平级的 XML 元素。
XMLFOREST(value [AS alias], ...)适合把一行记录转成若干标签,避免逐个 XMLELEMENT 嵌套。
SELECT XMLFOREST(ename AS n, sal AS s) FROM emp WHERE rownum = 1;为 XML 元素生成属性,必须作为 XMLELEMENT 的第一个参数。
XMLATTRIBUTES(value [AS alias], ...)属性名默认取表达式别名,无别名时取列名。
SELECT XMLELEMENT("emp", XMLATTRIBUTES(empno AS id), ename) FROM emp WHERE rownum = 1;聚合函数:把多行的 XML 片段拼接成一个 XML 文档。
XMLAGG(XMLType_instance [ORDER BY ...])是 XML 版的 LISTAGG,非常适合超长文本拼接(不受 4000 字节限制),常用于 Oracle 生成 CSV/HTML 报表。
SELECT XMLAGG(XMLELEMENT("e", ename || ',') ORDER BY ename) FROM emp;把字符串解析为 XMLType。
XMLPARSE({DOCUMENT|CONTENT} value [WELLFORMED])DOCUMENT 要求有唯一根节点;CONTENT 允许片段。
SELECT XMLPARSE(DOCUMENT '<a>1</a>') FROM dual;把 XMLType 序列化为字符串(VARCHAR2/CLOB)。
XMLSERIALIZE({CONTENT|DOCUMENT} expr AS type [NO INDENT])调试 XML 输出时很实用;省略缩进子句时是否美化输出不确定,需要稳定格式应显式指定 INDENT SIZE 或 NO INDENT。
SELECT XMLSERIALIZE(CONTENT XMLELEMENT("a", 1) AS VARCHAR2(100)) FROM dual;按 XPath 从 XMLType 中提取标量值或节点。
EXTRACTVALUE(xmltype, xpath) | EXTRACT(xmltype, xpath)EXTRACTVALUE 返回标量文本(已废弃,推荐 XMLQUERY + XMLTABLE);EXTRACT 返回 XMLType 节点。
SELECT EXTRACTVALUE(XMLPARSE(DOCUMENT '<a><b>7</b></a>'), '/a/b') FROM dual;执行 XQuery 表达式并返回 XMLType 结果。
XMLQUERY(xquery_string PASSING xmltype RETURNING CONTENT [NULL ON EMPTY])是 EXTRACT/EXTRACTVALUE 的官方替代;配合 XMLSERIALIZE 或 XMLTABLE 使用。
SELECT XMLSERIALIZE(CONTENT XMLQUERY('/a/b' PASSING XMLPARSE(DOCUMENT '<a><b>7</b></a>') RETURNING CONTENT) AS VARCHAR2(20)) FROM dual;把 XML 数据按 XPath 展开成关系表,可在 FROM 中直接查询。
XMLTABLE(xquery [PASSING ...] COLUMNS col type PATH '...')处理 XML 报文入库、把嵌套 XML 转成多行记录的首选方式。
SELECT t.v FROM XMLTABLE('/r/i' PASSING XMLPARSE(DOCUMENT '<r><i>a</i><i>b</i></r>') COLUMNS v VARCHAR2(10) PATH '.') t;把 XML 值转换成指定的 SQL 标量类型;Oracle 不支持用 XMLCAST 反向把 SQL 标量转换成 XML。
XMLCAST(expr AS datatype)XMLTABLE/XMLQUERY 结果转具体类型时使用。
SELECT XMLCAST(XMLQUERY('/a/b' PASSING XMLPARSE(DOCUMENT '<a><b>7</b></a>') RETURNING CONTENT) AS NUMBER) FROM dual;根据表达式(对象类型或标量)自动生成 XML 文档;XMLAGG 的封装版。
SYS_XMLGEN(expr) | SYS_XMLAGG(expr)适合快速把查询结果转 XML,输出结构由 Oracle 规则决定,可控性弱于手动构造。
SELECT SYS_XMLGEN(ename) FROM emp WHERE rownum = 1;生成带 name 属性的 XML 片段,便于标识字段来源。
XMLCOLATTVAL(value [AS alias], ...)输出形式如 <column name="ENAME">SMITH</column>。
SELECT XMLCOLATTVAL(ename) FROM emp WHERE rownum = 1;对表达式计算哈希值,可限定桶数量。
ORA_HASH(expr [, max_bucket] [, seed_value])常用来做数据分片、抽样、生成稳定伪随机分组;值稳定,同一输入结果一致。
SELECT ORA_HASH('abc', 10) FROM dual;按标准算法计算哈希,返回 RAW。
STANDARD_HASH(expr [, hash_method])hash_method 支持 SHA1(默认)、SHA256、SHA384、SHA512、MD5;适合做数据校验比对。
SELECT STANDARD_HASH('abc', 'SHA256') FROM dual;把 RAW 值按字节重解释为 VARCHAR2。
UTL_RAW.CAST_TO_VARCHAR2(raw)不改变字节内容,只换类型解释;转换后需注意字符集正确性。
SELECT UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('4F5241')) FROM dual;对二进制数据做 Base64 编码,返回 RAW。
UTL_ENCODE.BASE64_ENCODE(raw)编码结果需再经 UTL_RAW.CAST_TO_VARCHAR2 才能变成可读 Base64 字符串。
SELECT UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('abc'))) FROM dual;对 Base64 编码的 RAW 数据解码。
UTL_ENCODE.BASE64_DECODE(raw_base64)解码后再 CAST_TO_VARCHAR2 得到原文。
SELECT UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW('YWJj'))) FROM dual;对 URL 中的特殊字符进行百分号编码 / 解码。
UTL_URL.ESCAPE(url [, escape_reserved_chars] [, url_charset]) | UTL_URL.UNESCAPE(url)UTL_URL.ESCAPE 和 UTL_URL.UNESCAPE 都是返回 VARCHAR2 的函数,用于 URL 百分号编码与解码;指定字符集时注意与目标系统一致。
-- PL/SQL:TRUE 表示同时转义 URL 保留字符
DECLARE u VARCHAR2(200);
BEGIN
u := UTL_URL.ESCAPE('a b&c', TRUE);
DBMS_OUTPUT.PUT_LINE(u);
END;
/返回表达式的数据类型、字节长度及内部字节表示。
DUMP(expr [, return_fmt [, start_position [, length]]])排查字符集、乱码、隐式转换问题时非常有用;return_fmt 8/10/16 控制进制。
SELECT DUMP('AB', 16) FROM dual;返回表达式内部表示的字节数。
VSIZE(expr)与 LENGTHB 类似但作用于任意类型;对 NUMBER 返回其内部存储字节数。
SELECT VSIZE('AB'), VSIZE(123) FROM dual;把字符串中的非 ASCII 字符转成 \xxxx 形式的 Unicode 转义表示。
ASCIISTR(char)用于定位乱码字符、生成与数据库字符集无关的字符串表示。
SELECT ASCIISTR('中A') FROM dual;把含 \xxxx 转义的字符串还原为 Unicode 字符。
UNISTR(char)与 ASCIISTR 互逆;可直接写 UNISTR('\4E2D') 得到「中」。
SELECT UNISTR('\4E2D\6587') FROM dual;COMPOSE 把 Unicode 分解式字符组合为合成式;DECOMPOSE 反向拆分。
COMPOSE(char) | DECOMPOSE(char)处理带重音符号的欧洲文字比较时有用;对中文无影响。
SELECT COMPOSE(UNISTR('a\0301')) FROM dual;返回 SOUNDEX/CODEX 类排序的评分值,用于模糊匹配打分。
SCORE(expr)属冷门函数,实际模糊匹配更多用 UTL_MATCH 包。
SELECT SCORE('abc') FROM dual;计算两个字符串的编辑距离 / 相似度百分比(0~100)。
UTL_MATCH.EDIT_DISTANCE(s1, s2) | EDIT_DISTANCE_SIMILARITY(s1, s2)做姓名、地址模糊匹配时比 SOUNDEX 更准确。
SELECT UTL_MATCH.EDIT_DISTANCE('oracle', 'oracl') , UTL_MATCH.EDIT_DISTANCE_SIMILARITY('oracle','oracl') FROM dual;返回当前会话的数据库用户名(大写)。
USER可与 SYS_CONTEXT('USERENV','SESSION_USER') 对比,后者可反映代理用户场景。
SELECT USER FROM dual;返回当前用户的数字 ID。
UID可用于审计或按用户区分数据;ID 在不同库中不通用。
SELECT UID FROM dual;返回应用上下文命名空间中的参数值。
SYS_CONTEXT('namespace', 'parameter' [, length])常用 'USERENV' 命名空间:SESSION_USER、CURRENT_SCHEMA、IP_ADDRESS、HOST、DB_NAME、SID 等,是审计与行级安全的关键函数。
SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS'), SYS_CONTEXT('USERENV','DB_NAME') FROM dual;生成一个 16 字节的全局唯一标识符(RAW 类型)。
SYS_GUID()常用于主键替代序列;要字符串形式用 RAWTOHEX(SYS_GUID())。
SELECT RAWTOHEX(SYS_GUID()) FROM dual;生成随机数或随机字符串。
DBMS_RANDOM.VALUE [ (low, high) ] | DBMS_RANDOM.STRING(opt, len)VALUE 不带参返回 0~1 之间小数,带参返回 [low, high) 区间小数;取整数用 TRUNC(DBMS_RANDOM.VALUE(1,100))。需先 SEED 才可复现。
SELECT TRUNC(DBMS_RANDOM.VALUE(1, 100)) FROM dual;把集合类型(嵌套表/数组)当作表在 FROM 中展开成行。
TABLE(collection_expression)常与 COLLECT、SPLIT 拆分函数配合,实现数组到多行的转换。
SELECT column_value FROM TABLE(sys.odcivarchar2list('a','b','c'));返回嵌套表中元素的数量。
CARDINALITY(nested_table)对 VARRAY 与嵌套表都有效;不适用于关联数组。
SELECT CARDINALITY(sys.odcivarchar2list('a','b')) FROM dual;集合运算:去重、并、交、差。
SET(collection) | expr MULTISET UNION|INTERSECT|EXCEPT expr如 SET(collect(...)) 去重,CAST(MULTISET(...) AS ...) 把子查询结果转为集合。
SELECT CARDINALITY(SET(sys.odcivarchar2list('a','a','b'))) FROM dual;把表达式按指定的对象类型(或子类型)处理,用于对象类型继承场景。
TREAT(expr AS type)仅在对象关系特性中使用,普通业务表很少涉及。
SELECT TREAT(VALUE(t) AS student_typ).major FROM t;返回对象表中的对象实例。
VALUE(table_alias)配合对象类型表使用;普通关系表无需。
SELECT VALUE(t) FROM t;返回对象行的引用(指向行对象的指针)。
REF(table_alias)对象关系特性的组成部分,非对象表不可用。
SELECT REF(t) FROM t;返回空的 LOB 定位器,用于 INSERT/UPDATE 初始化 LOB 列。
EMPTY_CLOB() | EMPTY_BLOB()初始化后才能用 DBMS_LOB 写入数据;直接赋值 NULL 会导致后续 LOB 操作失败。
INSERT INTO t(id, content) VALUES (1, EMPTY_CLOB());返回 LOB 字段的字符/字节长度。
DBMS_LOB.GETLENGTH(lob_loc)CLOB 返回字符数,BLOB 返回字节数;SQL 的 LENGTH 也支持 CLOB,选择 DBMS_LOB.GETLENGTH 主要是为了统一处理 LOB 类型。
SELECT DBMS_LOB.GETLENGTH(content) FROM t WHERE id = 1;从 LOB 中截取子串(支持 CLOB 与 BLOB)。
DBMS_LOB.SUBSTR(lob_loc, amount, offset)CLOB 最多返回 32767 字符,BLOB 最多 32767 字节;是处理大文本的必备函数。
SELECT DBMS_LOB.SUBSTR(content, 100, 1) FROM t WHERE id = 1;DBMS_ROWID 包用于解析 ROWID 的结构信息(对象号、文件号、块号、行号)。
DBMS_ROWID.ROWID_TYPE(rowid) 等排查数据损坏、定位物理存储位置时使用,日常开发几乎用不到。
SELECT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) FROM emp WHERE rownum = 1;系统单行单列表,用于计算表达式、调用函数或获取序列值。
SELECT ... FROM dual不是函数但必须掌握:查询常量、调用 SYSDATE/SYS_GUID、序列 NEXTVAL 都依赖它。
SELECT 1 + 1 FROM dual;ROWNUM 是结果集行号(在 ORDER BY 之前分配);ROWID 是行的物理地址。
ROWNUM | ROWID分页经典陷阱:WHERE ROWNUM <= 10 可行,但 ORDER BY 后再取 ROWNUM 需嵌套子查询,否则顺序不对。
SELECT * FROM (SELECT ename, sal FROM emp ORDER BY sal DESC) WHERE ROWNUM <= 3;层级查询专用:LEVEL 为层号,CONNECT_BY_ROOT 取根节点列值,SYS_CONNECT_BY_PATH 生成从根到当前节点的路径串。
CONNECT_BY_ROOT col | LEVEL | SYS_CONNECT_BY_PATH(col, '/')配合 START WITH ... CONNECT BY PRIOR ... 使用,是组织架构、BOM、树状分类查询的核心。
SELECT LEVEL, ename, SYS_CONNECT_BY_PATH(ename, '/') path FROM emp START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr;本类别还包含 SYS_CONTEXT 的自定义命名空间(CREATE CONTEXT)、DBMS_SESSION 等,属于会话与环境管理范畴。
—自定义上下文需 DBA 授权 CREATE ANY CONTEXT,用于实现行级安全(VPD)。
SELECT SYS_CONTEXT('MY_CTX', 'TENANT_ID') FROM dual;