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 行记录)