数学函数

最近更新时间:2026-05-06 16:28:13

我的收藏
说明:
适用版本:TCHouse-X 内核版本 2.0.0及以上版本。
数学函数(Arithmetic Functions)用于执行比基础加减乘除更复杂的数值计算。TCHouse-X 提供了丰富的函数库,涵盖三角学、对数、指数、进制转换及统计分桶等操作。

基础算术与算术扩展

函数
返回类型
说明
示例
abs(x)
x 相同
返回 x 的绝对值。
select abs(-10); --10
add(x, y)
x 相同
返回 x + yxy 类型须一致。
select add(5,2); --7
checked_add(x, y)
x 相同
安全加法。溢出时报错。
select checked_add(5,2); --7
subtract(x, y)
x 相同/Decimal
返回 x - yxy 类型须一致。
select subtract(10, 2); -- 8
checked_subtract(x, y)
x 相同/Decimal
安全减法,在溢出时报错。
-
multiply(x, y)
x 相同/Decimal
返回 x * yxy 类型须一致。
select multiply(2,4); -- 8
checked_multiply(x, y)
x 相同/Decimal
安全乘法,在溢出时报错。
-
divide(x, y)
Double/Decimal
返回 x ÷ yxy 类型须一致。执行浮点除法,结果保留 6 位小数,除以零返回 NULL
select divide(2,4); -- 0.500000
checked_divide(x, y)
Double/Decimal
安全除法,在溢出时报错。
-
x div y
Bigint
整数除法,结果向下取整。溢出或除以零返回 NULL
select 1 div 2; -- 0
select 3 div 2; -- 1
select -3 div 2; -- -2
pmod(n, m)
n 相同
返回 n ÷ m 的正余数。
select pmod(-10, 3); -- 2
select pmod(10, 3); -- 1
remainder(n, m)
n 相同
返回 n % m 的余数(同 Spark %)。
select remainder(-10, 3); -- -1
select remainder(10, 3); -- 1
unaryminus(x)
x 相同
返回 -x
select unaryminus(1); -- -1
select unaryminus(-1); -- 1
select unaryminus(0); -- 0

数值修约与比较函数

函数
返回类型
说明
示例
ceil(x)
x 相同
向上取整。支持 Bigint, Double, Decimal
select ceil(1.23); --2
floor(x)
x 相同
向下取整。支持 Bigint, Double, Decimal
select floor(1.23); --1
round(x, d)
x 相同
四舍五入到 d 位(使用 HALF_UP 模式)。
select round(1.2345,2); --1.23
rint(x)
Double
返回最接近 x 的整数(双精度)。
select rint(12.34); --12
select rint(12.54); --13
greatest(x, ...)
x 相同
返回参数列表中的最大值,忽略 NULL
select greatest(1, 5, 2); --5
least(x, ...)
x 相同
返回参数列表中的最小值,忽略 NULL
select least(1, 5, 2); --1
sign(x) / signum
Double
返回符号:正数 1,负数 -1,零 0
select sign(100);-- 1
select sign(-100);-- -1
select sign(0);-- 0

指数、对数与幂运算

函数
返回类型
说明
示例
e()
Double
返回欧拉常数 e
select e(); --2.7182818284590451
exp(x)
Double
返回欧拉常数ex次幂。
select exp(1); --2.7182818284590451
select exp(2); --7.38905609893065
expm1(x)
Double
返回e^x - 1。在 x 接近 0 时比 exp(x)-1 更精确。
select expm1(1); --1.7182818284590451
ln(x) / log(x)
Double
返回 x 的自然对数(以 e 为底)。
select log(e()); --1
select ln(e()); --1
log(base, x)
Double
返回以 base 为底的 x 的对数。
select log(2, 8); --3
log10(x)
Double
返回以 10 为底的对数。
select log10(100); --2
log2(x)
Double
返回以 2 为底的对数。
select log2(8); --3
log1p(x)
Double
返回 ln(x + 1)
select log1p(0); --0
pow(x, p)
Double
返回 xp 次幂。
select pow(2, 3); --8
sqrt(x)
Double
返回 x 的平方根。
select sqrt(9); --3
cbrt(x)
Double
返回 x 的立方根。
select cbrt(8);--2
factorial(x)
Bigint
返回 x 的阶乘(x 须在 0-20 之间)。
select factorial(5); --120

三角函数

函数
返回类型
说明
示例
sin(x)
Double
返回 x(弧度)的正弦值。
SELECT sin(PI()/2); -- 结果:1 (90°的正弦)
cos(x)
Double
返回 x(弧度)的余弦值。
SELECT cos(PI()); -- 结果:-1 (180°的余弦)
tan(x)
Double
返回 x(弧度)的正切值。
SELECT tan(PI() / 4); -- 预期 1.0,实际返回 0.99999999999999989(浮点精度误差,非 bug)
asin(x)
Double
返回 x(弧度)的反正弦值。
SELECT asin(1.0); --1.57079... (π/2)
acos(x)
Double
返回 x(弧度)的反余弦值。
SELECT acos(-1.0); --3.14159... (π)
atan(x)
Double
返回 x(弧度)的反正切值。
SELECT atan(1.0); --0.78539... (π/4)
sinh(x)
Double
返回 x(弧度)的双曲正弦 。
SELECT sinh(1.0); --1.1752...
cosh(x)
Double
返回 x(弧度)的双曲余弦。
SELECT cosh(0); --1
tanh(x)
Double
返回 x(弧度)的双曲正切值。
SELECT tanh(0.5); --0.4621...
asinh(x)
Double
返回 x(弧度)的反双曲正弦值。
SELECT asinh(1.0); --0.8813...
acosh(x)
Double
返回 x(弧度)的反双曲余弦值。
SELECT acosh(1.0); --0
atanh(x)
Double
返回 x(弧度)的反双曲正切值。
SELECT atanh(0.5); --0.5493...
cot(x)
Double
返回 x(弧度)的余切值。
SELECT cot(PI() / 4); -- 预期结果 1.0,实际返回 1.0000000000000002(浮点精度误差,非 bug)
csc(x)
Double
返回 x(弧度)的余割值。
SELECT csc(PI()/2);--1 (余割,1/sin)
sec(x)
Double
返回 x(弧度)的正割值。
SELECT sec(0); -- 结果:1.0 (正割,1/cos)
atan2(y, x)
Double
返回 y/x 的反正切值。兼容 Spark 极端情况。
SELECT atan2(1, 1); --0.78539... (坐标 (1,1) 的极角)
degrees(x)
Double
将弧度转换为角度。
SELECT degrees(PI()); -- 180
radians(x)
Double
将角度转换为弧度。
SELECT radians(180); --3.14159...(π)
hypot(a, b)
Double
返回sqrt(a^2 + b^2) 的值
SELECT hypot(3, 4); --5

进制转换与位操作

函数
返回类型
说明
示例
bin(x)
Varchar
返回 Long 类型 x 的二进制字符串。
SELECT bin(10); --'1010'
hex(x)
Varchar
返回 x 的十六进制字符串。支持数字、字符串和二进制。
SELECT hex(255); --'FF'
unhex(x)
Varbinary
将十六进制字符串转回二进制。匹配 Spark 3.5.3 行为。
SELECT hex('ABC'); --'414243'
conv(n, f, t)
Varchar
将数字从 f 进制转换为 t 进制。
SELECT conv('1010', 2, 10); --'10'
SELECT conv('FF', 16, 2); --'11111111'
unscaled_value(x)
Bigint
返回短小数(Short Decimal)的原始 Bigint 值。
SELECT unscaled_value(CAST(12.34 AS DECIMAL(10, 2))); --1234

其他特殊函数

函数
返回类型
说明
示例
isnan(x)
Boolean
检查 x 是否为 NaN。支持 Float/Double
SELECT isnan(cast('nan' as double)); -- 1
rand([seed]) /random([seed])
Double
返回 [0, 1) 范围内的随机数。指定 seed 可获得确定性结果。
SELECT rand(); -- 结果随机
SELECT rand(123); -- 结果固定
not(x)
Boolean
not true 返回 false
SELECT not(1 = 1); --0
width_bucket(x, b1, b2, n)

Bigint
x 分配到从 b1b2 划分为 n 个等宽桶中的桶编号。
SELECT
val,
width_bucket(val, 0, 100, 4) as bucket_id
FROM
(
VALUES
(-5),
(20),
(50),
(90),
(110)
) AS t(val);
+------+-----------+
| val | bucket_id |
+------+-----------+
| -5 | 0 |
| 20 | 1 |
| 50 | 3 |
| 90 | 4 |
| 110 | 5 |
+------+-----------+