跳到主要内容

Oracle 系统函数

Halo 数据库在 Oracle 兼容模式下支持 Oracle 常用的系统函数。本节按用途分为以下几类进行介绍:

  • 数值函数:绝对值、取整、对数、三角、幂运算、按位与、日期减法等
  • 字符函数:字符串的转换、拼接、截取、查找、替换、填充、修剪与类型诊断
  • 日期函数:当前日期时间、日期加减、月末、月份差、取整等
  • 转换函数:字符集、数值、日期、十六进制、全角/半角之间的转换
  • 聚组函数:AVG/SUM/MAX/MIN/COUNT/STDDEV/VARIANCE/LISTAGG/MEDIAN/WM_CONCAT 等聚合函数
  • 分析函数:RANK/DENSE_RANK/ROW_NUMBER/LAG/LEAD 等窗口函数
  • 正则表达式函数:REGEXP_LIKE/COUNT/INSTR/SUBSTR/REPLACE
  • 空值处理函数:NVL/NVL2/LNNVL
  • 版本与状态函数:GET_FULL_VERSION_NUM/GET_MAJOR_VERSION/GET_PLATFORM 等

数值函数​

ABS

  • 功能:返回数值的绝对值。
  • 参数:ABS(n),n 为数值。
  • 返回值:数值,n 的绝对值。
oracle=# SELECT ABS(-15) FROM DUAL;
abs
-----
15
(1 行记录)

CEIL

  • 功能:向上取整,返回大于等于参数的最小整数。
  • 参数:CEIL(n),n 为数值。
  • 返回值:整数。
oracle=# SELECT CEIL(3.2) FROM DUAL;
ceil
------
4
(1 行记录)

FLOOR

  • 功能:向下取整,返回小于等于参数的最大整数。
  • 参数:FLOOR(n),n 为数值。
  • 返回值:整数。
oracle=# SELECT FLOOR(3.8) FROM DUAL;
floor
-------
3
(1 行记录)

MOD

  • 功能:返回除法运算的余数。
  • 参数:MOD(n, m),n 为被除数,m 为除数。
  • 返回值:数值,n 除以 m 的余数。
oracle=# SELECT MOD(10, 3) FROM DUAL;
mod
-----
1
(1 行记录)

POWER

  • 功能:返回 n 的 m 次幂。
  • 参数:POWER(n, m),n 为底数,m 为指数。
  • 返回值:数值。
oracle=# SELECT POWER(2, 10) FROM DUAL;
power
-------
1024
(1 行记录)

ROUND

  • 功能:按指定小数位数对数值四舍五入。
  • 参数:ROUND(n, d),n 为数值,d 为保留的小数位数(省略时为 0)。
  • 返回值:数值。
oracle=# SELECT ROUND(1234.5678, 2) FROM DUAL;
round
----------
1234.57
(1 行记录)

TRUNC

  • 功能:按指定小数位数对数值截断(不舍入),也可用于截断日期。
  • 参数:TRUNC(n, d),n 为数值(或日期),d 为保留的小数位数(省略时为 0)。
  • 返回值:数值(或日期)。
oracle=# SELECT TRUNC(1234.5678, 2) FROM DUAL;
trunc
---------
1234.56
(1 行记录)

SIGN

  • 功能:判断数值的符号。
  • 参数:SIGN(n),n 为数值。
  • 返回值:正数返回 1,负数返回 -1,零返回 0。
oracle=# SELECT SIGN(-3.14) FROM DUAL;
sign
------
-1
(1 行记录)

SQRT

  • 功能:返回数值的平方根。
  • 参数:SQRT(n),n 为非负数值。
  • 返回值:数值。
oracle=# SELECT SQRT(16) FROM DUAL;
sqrt
------
4
(1 行记录)

LOG / LN

  • 功能:LOG(m, n) 返回以 m 为底 n 的对数;LN(n) 返回 n 的自然对数(以 e 为底)。
  • 参数:LOG(m, n) / LN(n)。
  • 返回值:数值。
oracle=# SELECT LOG(10, 1000) FROM DUAL;
log
--------------------
3.0000000000000000
(1 行记录)

oracle=# SELECT LN(2.7182818) FROM DUAL;
ln
--------------------
0.9999999895305023
(1 行记录)

EXP

  • 功能:返回 e 的 n 次幂(自然指数)。
  • 参数:EXP(n),n 为数值。
  • 返回值:数值。
oracle=# SELECT EXP(1) FROM DUAL;
exp
--------------------
2.718281828459045
(1 行记录)

SIN / COS / TAN

  • 功能:分别返回数值的正弦、余弦、正切值(弧度制)。
  • 参数:SIN(n) / COS(n) / TAN(n),n 为以弧度表示的数值。
  • 返回值:数值。
oracle=# SELECT SIN(0), COS(0), TAN(0) FROM DUAL;
sin | cos | tan
-----+-----+-----
0 | 1 | 0
(1 行记录)

SINH / COSH / TANH

  • 功能:分别返回数值的双曲正弦、双曲余弦、双曲正切值。
  • 参数:SINH(n) / COSH(n) / TANH(n),n 为数值。
  • 返回值:数值。
oracle=# SELECT SINH(0), COSH(0), TANH(0) FROM DUAL;
sinh | cosh | tanh
------+------+------
0 | 1 | 0
(1 行记录)

BITAND

  • 功能:对两个整数执行按位与(AND)操作。
  • 参数:BITAND(expr1, expr2),两个参数均为 BIGINT。
  • 返回值:BIGINT,两参数逐位与的结果。

注意:BITAND 的参数须为整数类型。普通整数字面量可直接传入,例如 BITAND(5, 3);NUMBER 在 Halo 内部映射为 numeric,直接传入 numeric 值会报"函数 bitand(numeric, numeric) 不存在",需显式转换为 BIGINT 后再调用,例如 BITAND(col::bigint, 3)。

oracle=# SET search_path TO oracle, public;
SET
oracle=# SELECT BITAND(5::bigint, 3::bigint) FROM DUAL;
bitand
--------
1
(1 行记录)

SUBTRACT

  • 功能:从日期或时间戳中减去一个数值(按天计算),得到一个时间点。
  • 参数:SUBTRACT(date_or_timestamp, n),第一参数为 DATE / TIMESTAMP 类型,第二参数 n 为整数(单位:天)。
  • 返回值:DATETIME,第一参数减去 n 天后的时间点。

限制:仅支持"日期减整数"。当前不支持两个日期相减(求天数差),调用会报错,请勿用于该场景。

oracle=# SET search_path TO oracle, public;
SET
oracle=# SELECT SUBTRACT(DATE '2026-01-10', 5) FROM DUAL;
subtract
---------------------
2026-01-05 00:00:00
(1 行记录)

字符函数​

ASCII / CHR

  • 功能:ASCII 返回首字符的 ASCII 码;CHR 返回给定 ASCII 码对应的字符。两者互为逆运算。
  • 参数:ASCII(str) / CHR(n)。
  • 返回值:ASCII 返回整数;CHR 返回单字符。
oracle=# SELECT ASCII('A'), CHR(65) FROM DUAL;
ascii | chr
-------+-----
65 | A
(1 行记录)

CONCAT

  • 功能:连接两个字符串。Oracle 的 CONCAT 仅接受两个参数,连接多个字符串时建议使用 ||。
  • 参数:CONCAT(str1, str2)。
  • 返回值:字符串。
oracle=# SELECT CONCAT('Hello', 'World') FROM DUAL;
concat
------------
HelloWorld
(1 行记录)

INITCAP / LOWER / UPPER

  • 功能:INITCAP 将每个单词首字母大写其余小写;LOWER 转小写;UPPER 转大写。
  • 参数:INITCAP(str) / LOWER(str) / UPPER(str)。
  • 返回值:字符串。
oracle=# SELECT INITCAP('hello world'), LOWER('HELLO'), UPPER('hello') FROM DUAL;
initcap | lower | upper
-------------+-------+-------
Hello World | hello | HELLO
(1 行记录)

LENGTH

  • 功能:返回字符串的长度(字符数)。
  • 参数:LENGTH(str)。
  • 返回值:整数。
oracle=# SELECT LENGTH('hello') FROM DUAL;
length
--------
5
(1 行记录)

LPAD / RPAD

  • 功能:分别从左侧、右侧用指定字符将字符串填充到指定长度。
  • 参数:LPAD(str, len, pad) / RPAD(str, len, pad),len 为目标长度,pad 为填充字符。
  • 返回值:字符串。
oracle=# SELECT LPAD('hello', 10, '*'), RPAD('hello', 10, '*') FROM DUAL;
lpad | rpad
------------+------------
*****hello | hello*****
(1 行记录)

LTRIM / RTRIM / TRIM

  • 功能:LTRIM 删除左侧、RTRIM 删除右侧的指定字符;TRIM 可同时删除两侧字符,或用 TRIM(char FROM str) 删除指定字符。
  • 参数:LTRIM(str [, chars]) / RTRIM(str [, chars]) / TRIM([char FROM] str),chars 省略时为空格。
  • 返回值:字符串。
oracle=# SELECT LTRIM(' hello '), RTRIM(' hello ') FROM DUAL;
ltrim | rtrim
--------+--------
hello | hello
(1 行记录)

oracle=# SELECT TRIM('a' FROM 'aaaHelloaaa') FROM DUAL;
btrim
-------
Hello
(1 行记录)

REPLACE

  • 功能:将字符串中指定的子串替换为另一个字符串。
  • 参数:REPLACE(str, search [, replacement]),replacement 省略时删除 search。
  • 返回值:字符串。
oracle=# SELECT REPLACE('hello world', 'world', 'Halo') FROM DUAL;
replace
-------------
hello Halo
(1 行记录)

SUBSTR

  • 功能:从字符串指定位置截取指定长度的子串。
  • 参数:SUBSTR(str, start [, length]),start 从 1 开始(可为负),length 省略时取到末尾。
  • 返回值:字符串。
oracle=# SELECT SUBSTR('hello world', 7, 5) FROM DUAL;
substr
--------
world
(1 行记录)

TRANSLATE

  • 功能:按字符对应关系逐字符替换。将 str 中出现在第 2 个参数里的字符,逐个替换为第 3 个参数中对应位置的字符。
  • 参数:TRANSLATE(str, from, to),from 与 to 按位置一一对应。
  • 返回值:字符串。
oracle=# SELECT TRANSLATE('hello', 'lo', 'xy') FROM DUAL;
translate
-----------
hexxy
(1 行记录)

INSTR

  • 功能:返回子串在源字符串中出现的位置。
  • 参数:INSTR(str, sub [, start [, occurrence]])。
  • 返回值:整数,子串起始位置(从 1 开始);未找到返回 0。
oracle=# SELECT INSTR('hello world', 'world') FROM DUAL;
instr
-------
7
(1 行记录)

BTRIM

  • 功能:删除字符串首尾的指定字符。省略第二参数时删除首尾空格。
  • 参数:BTRIM(str [, chars]),str 为源字符串,chars 为要删除的字符集合。
  • 返回值:文本。
oracle=# SELECT BTRIM(' hello ') AS r1, BTRIM('xxxhelloxxx', 'x') AS r2 FROM DUAL;
r1 | r2
-------+-------
hello | hello
(1 行记录)

CONCAT_WS

  • 功能:用指定分隔符连接多个字符串。与 CONCAT 不同,CONCAT_WS 第一个参数为分隔符,且会跳过 NULL 值。
  • 参数:CONCAT_WS(separator, val1, val2, ...),separator 为分隔符,其余为待连接的值(可变参数)。
  • 返回值:文本。
oracle=# SELECT CONCAT_WS(',', 'a', 'b', 'c') FROM DUAL;
concat_ws
-----------
a,b,c
(1 行记录)

DUMP

  • 功能:返回表达式的内部存储信息,包括类型代码、长度和各字节的值,常用于类型诊断。
  • 参数:DUMP(expr [, radix]),expr 为任意类型表达式,可选 radix 指定字节值的进制(如 10、16)。
  • 返回值:文本,格式为 Typ=类型码 Len=长度: 字节值。

说明:当传入字符串字面量时,由于存在多个候选重载,需显式转换为 text(如 'ABC'::text),否则会报"函数 dump(unknown) 不是唯一的"。

oracle=# SELECT DUMP(255) AS num_dump, DUMP('ABC'::text) AS text_dump FROM DUAL;
num_dump | text_dump
-----------------------+--------------------------------
Typ=23 Len=4: 255,0,0,0 | Typ=25 Len=7: 28,0,0,0,65,66,67
(1 行记录)

oracle=# SELECT DUMP(255, 16) FROM DUAL;
dump
--------------------
Typ=23 Len=4: ff,0,0,0
(1 行记录)

日期函数​

SYSDATE / CURRENT_DATE / CURRENT_TIMESTAMP / LOCALTIMESTAMP

  • 功能:返回当前日期时间。SYSDATE 返回当前日期时间(数据库服务器时区);CURRENT_DATE 返回当前日期;CURRENT_TIMESTAMP 返回带时区的当前时间;LOCALTIMESTAMP 返回不含时区的当前时间。
  • 参数:均无参数。
  • 返回值:日期或时间戳,为执行时刻的实际值。
oracle=# SELECT SYSDATE, CURRENT_DATE FROM DUAL;
SYSDATE | CURRENT_DATE
--------------------+--------------
2026-07-30 14:02:24 | 2026-07-30
(1 行记录)

oracle=# SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP | LOCALTIMESTAMP
-------------------------------+----------------------------
2026-07-30 14:03:35.998776+08 | 2026-07-30 14:03:35.998776
(1 行记录)

DBTIMEZONE / SESSIONTIMEZONE

  • 功能:DBTIMEZONE 返回数据库时区;SESSIONTIMEZONE 返回当前会话时区。
  • 参数:均无参数。
  • 返回值:时区字符串。
oracle=# SELECT DBTIMEZONE, SESSIONTIMEZONE FROM DUAL;
DBTIMEZONE | SESSIONTIMEZONE
---------------+-----------------
Asia/Shanghai | Asia/Shanghai
(1 行记录)

ADD_MONTHS

  • 功能:在给定日期基础上增加指定的月数。
  • 参数:ADD_MONTHS(date, n),n 为月数(可为负)。
  • 返回值:日期。
oracle=# SELECT ADD_MONTHS(DATE '2024-01-15', 3) FROM DUAL;
ADD_MONTHS
---------------------
2024-04-15 00:00:00
(1 行记录)

LAST_DAY

  • 功能:返回给定日期所在月份的最后一天。
  • 参数:LAST_DAY(date)。
  • 返回值:日期。
oracle=# SELECT LAST_DAY(DATE '2024-02-15') FROM DUAL;
LAST_DAY
-------------------
2024-02-29 00:00:00
(1 行记录)

MONTHS_BETWEEN

  • 功能:返回两个日期之间的月数。
  • 参数:MONTHS_BETWEEN(date1, date2),计算 date1 与 date2 之间的月份差。
  • 返回值:数值。
oracle=# SELECT MONTHS_BETWEEN(DATE '2024-03-15', DATE '2024-01-15') FROM DUAL;
MONTHS_BETWEEN
----------------
2
(1 行记录)

NEXT_DAY

  • 功能:返回给定日期之后下一个指定的星期几。
  • 参数:NEXT_DAY(date, weekday),weekday 为星期名称(如 'MONDAY')。
  • 返回值:日期。
oracle=# SELECT NEXT_DAY(DATE '2024-01-01', 'MONDAY') FROM DUAL;
NEXT_DAY
-------------------
2024-01-08 00:00:00
(1 行记录)

EXTRACT

  • 功能:从日期/时间值中提取指定的字段(如年、月、日)。
  • 参数:EXTRACT(field FROM source),field 可为 YEAR、MONTH、DAY 等。
  • 返回值:数值。
oracle=# SELECT EXTRACT(YEAR FROM DATE '2024-05-20') FROM DUAL;
EXTRACT
---------
2024
(1 行记录)

ROUND / TRUNC(日期)

  • 功能:对日期按指定单位取整。ROUND 按指定单位四舍五入,TRUNC 按指定单位截断。常用单位有 YYYY(年)、MM/MONTH(月)、DD/DAY(日)。
  • 参数:ROUND(date [, fmt]) / TRUNC(date [, fmt]),fmt 为格式单位(省略时默认截断/取整到日)。
  • 返回值:日期。
oracle=# SELECT ROUND(DATE '2024-01-20', 'MM'), TRUNC(DATE '2024-01-20', 'MM') FROM DUAL;
ROUND | TRUNC
--------------------+--------------------
2024-02-01 00:00:00 | 2024-01-01 00:00:00
(1 行记录)

说明:上例中 ROUND 到月时,1 月 20 日已过月度中点(15 日),故进位到 2 月 1 日;TRUNC 到月时直接截断到当月 1 日。

转换函数​

CONVERT

  • 功能:在指定字符集之间转换字符串。
  • 参数:CONVERT(str, dest_charset [, src_charset]),dest_charset 为目标字符集,src_charset 为源字符集。
  • 返回值:字符串。
oracle=# SELECT CONVERT('Halo DataBase', 'UTF8', 'UTF8') FROM DUAL;
convert
--------------
Halo DataBase
(1 行记录)

TO_CHAR

  • 功能:将数值或日期按指定格式转换为字符串。
  • 参数:TO_CHAR(n | date [, fmt]),fmt 为格式模板(日期如 'YYYY-MM-DD',数值如 '99999.99')。
  • 返回值:字符串。
oracle=# SELECT TO_CHAR(DATE '2024-03-15', 'YYYY-MM-DD') FROM DUAL;
to_char
----------
2024-03-15
(1 行记录)

oracle=# SELECT TO_CHAR(12345.67, '99999.99') FROM DUAL;
to_char
-----------
12345.67
(1 行记录)

TO_DATE

  • 功能:将字符串按指定格式转换为日期类型。
  • 参数:TO_DATE(str [, fmt]),fmt 为日期格式模板(如 'YYYYMMDD')。
  • 返回值:日期。
oracle=# SELECT TO_DATE('20220101', 'YYYYMMDD') FROM DUAL;
to_date
--------------------
2022-01-01 00:00:00
(1 行记录)

TO_NUMBER

  • 功能:将字符串转换为数值类型。
  • 参数:TO_NUMBER(str [, fmt]),fmt 为可选格式模板。
  • 返回值:数值。
oracle=# SELECT TO_NUMBER('12345') FROM DUAL;
to_number
-----------
12345
(1 行记录)

HEXTORAW / RAWTOHEX

  • 功能:HEXTORAW 将十六进制字符串转换为二进制类型(RAW);RAWTOHEX 将 RAW 转换为十六进制字符串。两者互为逆运算。
  • 参数:HEXTORAW(hex_str) / RAWTOHEX(raw)。
  • 返回值:HEXTORAW 返回 RAW;RAWTOHEX 返回字符串。
oracle=# SELECT HEXTORAW('414243') FROM DUAL;
hextoraw
----------
414243
(1 行记录)

oracle=# SELECT RAWTOHEX(HEXTORAW('414243')) FROM DUAL;
rawtohex
----------
414243
(1 行记录)

TO_MULTI_BYTE / TO_SINGLE_BYTE

  • 功能:TO_MULTI_BYTE 将字符串中的半角字符转换为全角字符;TO_SINGLE_BYTE 反之,将全角字符转换为半角字符。
  • 参数:TO_MULTI_BYTE(str) / TO_SINGLE_BYTE(str)。
  • 返回值:字符串。
oracle=# SELECT TO_MULTI_BYTE('A') FROM DUAL;
to_multi_byte
---------------
A
(1 行记录)

oracle=# SELECT TO_SINGLE_BYTE('A') FROM DUAL;
to_single_byte
----------------
A
(1 行记录)

TO_HEX

  • 功能:将数值转换为十六进制字符串。
  • 参数:TO_HEX(n),n 为 numeric 类型。
  • 返回值:文本,n 的十六进制表示(小写,不含前缀)。
oracle=# SET search_path TO oracle, public;
SET
oracle=# SELECT TO_HEX(255::numeric) AS r1, TO_HEX(16::numeric) AS r2 FROM DUAL;
r1 | r2
----+----
ff | 10
(1 行记录)

聚组函数​

说明:本节示例使用如下示例表:

oracle=# CREATE TABLE Aggfun_test (
product_name VARCHAR(100),
sales_amount NUMERIC(10, 2)
);
CREATE TABLE
oracle=# INSERT INTO Aggfun_test VALUES
('Product A', 100.50), ('Product B', 200.75),
('Product C', 150.25), ('Product D', 75.80), ('Product E', 300.00);
INSERT 0 5

AVG / SUM

  • 功能:AVG 返回数值列的平均值;SUM 返回数值列的总和。
  • 参数:AVG(expr) / SUM(expr),常配合 GROUP BY 使用。
  • 返回值:数值。
oracle=# SELECT AVG(sales_amount) AS avg_sales, SUM(sales_amount) AS sum_sales FROM Aggfun_test;
avg_sales | sum_sales
----------------------+-----------
165.4600000000000000 | 827.30
(1 行记录)

MAX / MIN

  • 功能:MAX 返回最大值;MIN 返回最小值。可用于数值、字符、日期等多种类型。
  • 参数:MAX(expr) / MIN(expr)。
  • 返回值:与参数同类型。
oracle=# SELECT MAX(sales_amount) AS max_sales, MIN(sales_amount) AS min_sales FROM Aggfun_test;
max_sales | min_sales
-----------+-----------
300.00 | 75.80
(1 行记录)

COUNT

  • 功能:返回行数。COUNT(*) 返回总行数(含 NULL),COUNT(expr) 返回 expr 非 NULL 的行数。
  • 参数:COUNT(* | expr)。
  • 返回值:整数。
oracle=# SELECT COUNT(*) AS total_records FROM Aggfun_test;
total_records
---------------
5
(1 行记录)

STDDEV / VARIANCE

  • 功能:STDDEV 返回数值列的标准差;VARIANCE 返回方差。
  • 参数:STDDEV(expr) / VARIANCE(expr)。
  • 返回值:数值。
oracle=# \x on
扩展显示已打开
oracle=# SELECT STDDEV(sales_amount) AS sales_stddev, VARIANCE(sales_amount) AS sales_variance FROM Aggfun_test;
-[ RECORD 1 ]--+--------------------
SALES_STDDEV | 98.3361581515161696
SALES_VARIANCE | 9670

LISTAGG

  • 功能:将一组行的字符串值拼接成单个字符串,常用于行转列(字符串聚合)。
  • 参数:LISTAGG(str [, separator]),str 为待拼接的文本,separator 为分隔符(可省略,省略时直接拼接)。
  • 返回值:文本。

限制:Halo 的 LISTAGG 仅支持普通聚合形式 LISTAGG(str, separator),不支持 Oracle 标准的 WITHIN GROUP (ORDER BY ...) 排序子句。如需控制拼接顺序,请先在子查询中排序,再对外层使用 LISTAGG。

oracle=# SELECT LISTAGG(product_name, ', ') AS products FROM Aggfun_test;
products
-------------------------------------------------------
Product A, Product B, Product C, Product D, Product E
(1 行记录)

MEDIAN

  • 功能:返回数值列的中位数(将值排序后取中间值;偶数个值取中间两个的平均)。
  • 参数:MEDIAN(expr),expr 为数值表达式。
  • 返回值:数值。
oracle=# SELECT MEDIAN(sales_amount) AS median_sales FROM Aggfun_test;
median_sales
--------------
150.25
(1 行记录)

WM_CONCAT

  • 功能:将一组行的值拼接成单个字符串,以逗号分隔。与 LISTAGG 类似,但分隔符固定为逗号、不可配置。
  • 参数:WM_CONCAT(expr),expr 为文本或数值表达式。
  • 返回值:文本。
oracle=# SELECT WM_CONCAT(product_name) AS products FROM Aggfun_test;
products
---------------------------------------------------
Product A,Product B,Product C,Product D,Product E
(1 行记录)

分析函数​

分析函数(窗口函数)对一组行计算结果,常用于排名、累计、偏移、占比等统计场景。基本语法为 函数() OVER (PARTITION BY ... ORDER BY ...)。

说明:本节示例使用如下示例表:

oracle=# CREATE TABLE Analfun_test (
product_name VARCHAR(100),
region VARCHAR(100),
sales_amount NUMERIC(10, 2)
);
CREATE TABLE
oracle=# INSERT INTO Analfun_test VALUES
('Product A', 'North', 100.50), ('Product B', 'North', 200.75),
('Product C', 'South', 150.25), ('Product D', 'South', 75.80),
('Product E', 'West', 300.00);
INSERT 0 5

RANK / DENSE_RANK / ROW_NUMBER

  • 功能:均为排序函数。RANK 按值排序生成排名(并列后跳号);DENSE_RANK 同样生成排名但并列后不跳号;ROW_NUMBER 为每行生成唯一连续序号。
  • 参数:RANK() OVER (ORDER BY ...) / DENSE_RANK() OVER (ORDER BY ...) / ROW_NUMBER() OVER (ORDER BY ...)。
  • 返回值:整数。
oracle=# SELECT product_name, sales_amount,
RANK() OVER (ORDER BY sales_amount DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY sales_amount DESC) AS dense_rnk,
ROW_NUMBER() OVER (ORDER BY sales_amount DESC) AS row_num
FROM Analfun_test;
product_name | sales_amount | rnk | dense_rnk | row_num
--------------+--------------+-----+-----------+---------
Product E | 300.00 | 1 | 1 | 1
Product B | 200.75 | 2 | 2 | 2
Product C | 150.25 | 3 | 3 | 3
Product A | 100.50 | 4 | 4 | 4
Product D | 75.80 | 5 | 5 | 5
(5 行记录)

LAG / LEAD

  • 功能:LAG 返回当前行之前第 N 行的值;LEAD 返回当前行之后第 N 行的值。常用于计算环比、同比。
  • 参数:LAG(expr [, offset [, default]]) OVER (...) / LEAD(expr [, offset [, default]]) OVER (...),offset 默认 1,default 为超出范围时的默认值。
  • 返回值:与 expr 同类型。
oracle=# SELECT product_name, sales_amount,
LAG(sales_amount, 1, 0) OVER (ORDER BY sales_amount) AS prev_sales,
LEAD(sales_amount, 1, 0) OVER (ORDER BY sales_amount) AS next_sales
FROM Analfun_test;
product_name | sales_amount | prev_sales | next_sales
--------------+--------------+------------+------------
Product D | 75.80 | 0 | 100.50
Product A | 100.50 | 75.80 | 150.25
Product C | 150.25 | 100.50 | 200.75
Product B | 200.75 | 150.25 | 300.00
Product E | 300.00 | 200.75 | 0
(5 行记录)

聚合函数作为窗口函数(SUM / AVG / ... OVER)

  • 功能:将聚合函数与 OVER 子句结合,可在不聚合行数的前提下计算分组聚合值。PARTITION BY 定义分组。
  • 参数:SUM(expr) OVER (PARTITION BY ...) 等。
  • 返回值:数值。
oracle=# SELECT product_name, region, sales_amount,
SUM(sales_amount) OVER (PARTITION BY region) AS region_total
FROM Analfun_test;
product_name | region | sales_amount | region_total
--------------+--------+--------------+--------------
Product A | North | 100.50 | 301.25
Product B | North | 200.75 | 301.25
Product C | South | 150.25 | 226.05
Product D | South | 75.80 | 226.05
Product E | West | 300.00 | 300.00
(5 行记录)

正则表达式函数​

正则表达式函数用于在文本中匹配、查找、计数、提取和替换。Halo 支持 Oracle 常用的五个正则函数,匹配语义基于 PostgreSQL 正则引擎(POSIX ARE),支持 \d、\w、非贪婪匹配和前瞻断言等扩展语法。

REGEXP_LIKE

  • 功能:判断源字符串是否匹配指定正则表达式。
  • 参数:REGEXP_LIKE(str, pattern [, flags])。
  • 返回值:布尔值,匹配返回 t,否则返回 f。
oracle=# SELECT REGEXP_LIKE('abc123', '[0-9]') FROM DUAL;
regexp_like
-------------
t
(1 行记录)

REGEXP_COUNT

  • 功能:返回正则表达式在源字符串中匹配的次数。
  • 参数:REGEXP_COUNT(str, pattern [, start [, flags]]),start 为开始搜索位置(默认 1)。
  • 返回值:整数。
oracle=# SELECT REGEXP_COUNT('a1b2c3', '[0-9]') FROM DUAL;
regexp_count
--------------
3
(1 行记录)

REGEXP_INSTR

  • 功能:返回正则表达式在源字符串中首次匹配的起始位置。
  • 参数:REGEXP_INSTR(str, pattern [, start [, occurrence [, return_option [, flags [, subexpr]]]]])。
  • 返回值:整数,匹配起始位置(从 1 开始);未匹配返回 0。
oracle=# SELECT REGEXP_INSTR('Hello World', 'o') FROM DUAL;
regexp_instr
--------------
5
(1 行记录)

REGEXP_SUBSTR

  • 功能:提取源字符串中与正则表达式匹配的子串。
  • 参数:REGEXP_SUBSTR(str, pattern [, start [, occurrence [, flags [, subexpr]]]])。
  • 返回值:文本,匹配到的子串;未匹配返回 NULL。
oracle=# SELECT REGEXP_SUBSTR('phone 138-1234', '[0-9]+') FROM DUAL;
regexp_substr
---------------
138
(1 行记录)

REGEXP_REPLACE

  • 功能:将源字符串中匹配正则表达式的部分替换为指定字符串。
  • 参数:REGEXP_REPLACE(str, pattern [, replacement [, start [, occurrence [, flags]]]]),flags 为 g 时替换所有匹配,省略时仅替换第一个。
  • 返回值:文本。
oracle=# SELECT REGEXP_REPLACE('Hello World', 'o', '0', 'g') FROM DUAL;
regexp_replace
----------------
Hell0 W0rld
(1 行记录)

空值处理函数​

NVL

  • 功能:当第一参数为 NULL 时返回第二参数,否则返回第一参数。用于为 NULL 值提供默认值。
  • 参数:NVL(expr1, expr2),两个参数类型应兼容。
  • 返回值:与参数同类型。
oracle=# SELECT NVL(NULL, 99) AS r1, NVL(5, 99) AS r2 FROM DUAL;
r1 | r2
----+----
99 | 5
(1 行记录)

NVL2

  • 功能:根据第一参数是否为 NULL 返回不同值。第一参数非 NULL 时返回第二参数,为 NULL 时返回第三参数。
  • 参数:NVL2(expr1, expr2, expr3)。
  • 返回值:expr2 或 expr3。

注意:三个参数类型必须兼容(同类型或可隐式转换)。若第一参数为整数而第二、三参数为字符串字面量,会因类型推断冲突报错(如"无效的类型 integer 输入语法")。建议三个参数保持同一类型,例如 NVL2('x'::text, 'yes', 'no')。

oracle=# SELECT NVL2('x'::text, 'yes', 'no') AS notnull,
NVL2(NULL::text, 'yes', 'no') AS isnull FROM DUAL;
notnull | isnull
---------+--------
yes | no
(1 行记录)

LNNVL

  • 功能:对条件取逻辑否定,常用于 WHERE 子句中处理含 NULL 的条件。当条件为假或包含 NULL(未知)时返回真,条件为真时返回假。
  • 参数:LNNVL(condition),condition 为布尔表达式。
  • 返回值:布尔值。
oracle=# SELECT LNNVL(1=1) AS true_cond, LNNVL(1=2) AS false_cond FROM DUAL;
true_cond | false_cond
-----------+------------
f | t
(1 行记录)

版本与状态函数​

以下函数返回 Halo 数据库的版本与运行状态信息,均无参数,返回文本。

GET_FULL_VERSION_NUM

  • 功能:返回数据库的完整版本号(含内部构建号)。
oracle=# SELECT GET_FULL_VERSION_NUM() FROM DUAL;
get_full_version_num
----------------------
1.0.16.11 (260531)
(1 行记录)

GET_MAJOR_VERSION

  • 功能:返回数据库的主版本标识。
oracle=# SELECT GET_MAJOR_VERSION() FROM DUAL;
get_major_version
-------------------
Halo 16.11
(1 行记录)

GET_MAJOR_VERSION_NUM

  • 功能:返回数据库的主版本号。
oracle=# SELECT GET_MAJOR_VERSION_NUM() FROM DUAL;
get_major_version_num
-----------------------
16
(1 行记录)

GET_PLATFORM

  • 功能:返回数据库运行的平台信息。
oracle=# SELECT GET_PLATFORM() FROM DUAL;
get_platform
--------------
64bit
(1 行记录)

GET_STATUS

  • 功能:返回数据库实例的状态标识。
oracle=# SELECT GET_STATUS() FROM DUAL;
get_status
------------
Production
(1 行记录)