算术函数
概览
算术函数适用于任意两个操作数,其类型可以是 UInt8、UInt16、UInt32、UInt64、Int8、Int16、Int32、Int64、Float32 或 Float64。
在执行运算之前,两个操作数都会被转换为结果类型。结果类型按如下规则确定(除非下面函数文档中另有说明):
- 如果两个操作数的宽度都不超过 32 位,则结果类型的大小为两者中较大类型之后的下一个更大类型的大小(整数大小提升)。例如,
UInt8 + UInt16 = UInt32或Float32 * Float32 = Float64。 - 如果其中一个操作数为 64 位或更多位宽,则结果类型的大小与两者中较大的操作数类型相同。例如,
UInt32 + UInt128 = UInt128或Float32 * Float64 = Float64。 - 如果其中一个操作数是有符号类型,则结果类型也将是有符号类型,否则它将是无符号类型。例如,
UInt32 * Int32 = Int64或UInt32 * UInt32 = UInt64。
这些规则确保结果类型将是能够表示所有可能结果的最小类型。虽然这在数值范围边界附近引入了溢出的风险,但它确保了可以使用最大本机 64 位整数宽度进行快速计算。这种行为还保证了与许多将 64 位整数(BIGINT)作为最大整数类型的其他数据库之间的兼容性。
示例:
溢出的产生方式与 C++ 相同。
abs
引入版本:v1.1
计算 x 的绝对值。若 x 为无符号类型,则此函数无效果。若 x 为有符号类型,则返回一个无符号数。
语法
参数
x— 要取绝对值的数值
返回值
x 的绝对值
示例
使用示例
avg2
在 v25.11 中引入
计算并返回提供参数的平均值。 支持数值和时间数据类型。
语法
参数
x1, x2]— 接受两个用于计算平均值的参数。
返回值
返回所提供参数的平均值,并提升为最大兼容类型。
示例
数值类型
Decimal 类型
数据类型
DateTime 类型
Time64 类型
byteSwap
引入版本:v23.10
反转整数的字节顺序,即改变其字节序。
下面的示例可以按如下方式计算:
- 将十进制整数转换为其在大端格式下对应的十六进制表示,例如 3351772109 -> C7 C7 FB CD(4 字节)
- 反转字节顺序,例如 C7 C7 FB CD -> CD FB C7 C7
- 在假定为大端格式的前提下,将结果转换回整数,例如 CD FB C7 C7 -> 3455829959 此函数的一个用例是反转 IPv4 地址:
语法
参数
x— 整数值。(U)Int*
返回值
返回字节顺序反转后的 x。(U)Int*
示例
用法示例
8 位
16 位
32 位
64 位
divide
引入自:v1.1
计算两个值 a 和 b 的商。返回值类型始终为 Float64。
整数除法由 intDiv 函数提供。
除以 0 将返回 inf、-inf 或 nan。
语法
参数
x— 被除数,y— 除数
返回值
x 除以 y 的商
示例
两个数相除
除以零
divideDecimal
引入版本:v22.12
对两个十进制数执行除法运算。结果值的类型为 Decimal256。
可以通过 result_scale 参数(取值范围为 [0, 76] 的常量整数 Integer)显式指定结果的小数位数(scale)。如果未指定,结果的小数位数为传入参数中 scale 的最大值。
该函数的执行速度明显慢于常规的 divide。
如果你不需要严格控制精度和/或需要更快的计算,请考虑使用 divide。
语法
参数
返回值
在指定刻度下执行除法运算的结果。Decimal256
示例
示例 1
示例 2
divideOrNull
引入版本:v25.5
与 divide 相同,但在除数为零时返回 NULL。
语法
参数
x— 被除数,y— 除数
返回值
x 除以 y 的商,或 NULL。
示例
除以零
gcd
引入于:v1.1
返回两个值 a 和 b 的最大公约数。
当发生除以零运算或将最小负数值除以负一时会抛出异常。
语法
参数
x— 第一个整数,y— 第二个整数
返回值
x 和 y 的最大公约数。
示例
使用示例
ifNotFinite
引入自:v20.3
检查一个浮点数值是否为有限数。
你可以通过使用三元运算符获得类似的结果:isFinite(x) ? x : y。
语法
参数
返回值
- 当
x为有限值时,返回x。 - 当
x非有限值时,返回y。
示例
用法示例
intDiv
引入版本:v1.1
对两个值 x 和 y 执行整数除法。换句话说,它计算向下舍入到不大于实际结果的最接近整数的商。
结果与被除数(第一个参数)具有相同的位宽。
当除数为零、商不在被除数类型的取值范围内,或将最小负数除以 -1 时,会抛出异常。
语法
参数
x— 左操作数。 -y— 右操作数。
返回值
x 和 y 的整数除法结果
示例
两个浮点数的整数除法
商超出被除数的取值范围
intDivOrNull
引入于:v25.5
与 intDiv 相同,但在除以零或将最小负数除以负一时返回 NULL。
语法
参数
返回值
x 除以 y 的整数除法结果,或 NULL。
示例
整数除以零
将最小负数除以 -1
intDivOrZero
自 v1.1 引入
与 intDiv 相同,但在发生除以零,或将最小负数值除以负一时返回零。
语法
参数
返回值
对 a 和 b 进行整数除法的结果,或零。
示例
整数除以零
将最小负数除以 -1
isFinite
引入版本:v1.1
如果 Float32 或 Float64 参数既不是无穷大也不是 NaN,则返回 1,否则该函数返回 0。
语法
参数
x— 要检查是否为有限值的数值。Float*
返回值
如果 x 不是无穷大且不是 NaN,则返回 1,否则返回 0。
示例
测试一个数是否为有限值
isInfinite
引入版本:v1.1
如果 Float32 或 Float64 参数为无穷大,则返回 1,否则该 FUNCTION 返回 0。
注意,对于 NaN 会返回 0。
语法
参数
x— 要检查是否为无穷大的数值。Float*
返回值
如果 x 为无穷大则返回 1,否则返回 0(包括 NaN 情况)。
示例
测试一个数值是否为无穷大
isNaN
引入版本:v1.1
如果 Float32 或 Float64 类型的参数为 NaN,则返回 1,否则返回 0。
语法
参数
x— 用于判断是否为NaN的参数。Float*
返回值
若为 NaN 返回 1,否则返回 0
示例
用法示例
lcm
引入于:v1.1
返回两个值 x 和 y 的最小公倍数。
当发生除以零,或将最小负值除以 -1 时,会抛出异常。
语法
参数
返回值
返回 x 和 y 的最小公倍数。(U)Int*
示例
使用示例
max2
自 v21.11 起引入
返回两个数值 x 和 y 中较大的值。
语法
参数
x— 第一个值(U)Int8/16/32/64或Float*或Decimaly— 第二个值(U)Int8/16/32/64或Float*或Decimal
返回值
返回 x 和 y 中较大的值。Float64
示例
用法示例
midpoint
引入版本:v25.11
计算并返回给定参数的平均值。 支持数值类型和时间类型。
语法
参数
x1[, x2, ...]— 接受一个或多个用于求平均值的值。
返回值
返回所提供参数的平均值,结果会提升为兼容的最大类型。
示例
数值类型
Decimal 类型
日期类型
DateTime 类型
Time64 类型
min2
引入版本:v21.11
返回两个数值 x 和 y 中较小的一个。
语法
参数
x— 第一个值(U)Int8/16/32/64或Float*或Decimaly— 第二个值(U)Int8/16/32/64或Float*或Decimal
返回值
返回 x 和 y 中较小的一个值。Float64
示例
用法示例
minus
引入版本:v1.1
计算两个值 a 和 b 的差。结果始终为带符号值。
类似于 plus,可以从日期或日期时间中减去一个整数。
此外,支持两个日期时间值之间的减法,结果为它们之间的时间差。
语法
参数
x— 被减数。 -y— 减数。
返回值
x 减 y
示例
两个数相减
整数与日期的减法
modulo
引入于:v1.1
计算两个值 a 和 b 相除时的余数。
如果两个输入都是整数,则结果类型为整数。如果其中一个输入是浮点数,则结果类型为 Float64。
余数的计算方式与 C++ 相同。对负数使用截断除法。
当除数为零,或将最小负数值除以负一时,会抛出异常。
语法
别名: mod
参数
a— 被除数,b— 除数(模数)
返回值
a % b 的余数
示例
用法示例
moduloOrNull
引入版本:v25.5
计算 a 被 b 除时的余数。与函数 modulo 类似,但当右侧参数为 0 时,moduloOrNull 会返回 NULL。
语法
别名: modOrNull
参数
返回值
返回 x 除以 y 的余数,当除数为零时返回 null 值。
示例
除数为零的 moduloOrNull
moduloOrZero
引入版本:v20.3
与 modulo 类似,但当除数为零时返回零,而不是像 modulo 函数那样抛出异常。
语法
参数
返回值
返回 a % b 的余数,当除数为 0 时返回 0。
示例
使用示例
multiply
在 v1.1 中引入
计算两个值 x 和 y 的乘积。
语法
参数
返回值
返回 x 和 y 的乘积。
示例
两个数相乘
multiplyDecimal
引入版本:v22.12
对两个 decimal 执行乘法运算。结果类型为 Decimal256。
可以通过 result_scale 参数(取值范围为 [0, 76] 的常量 Integer)显式指定结果的 scale。若未指定,则结果的 scale 为所有输入参数中最大的 scale。
这些函数的运行速度明显慢于常规的 multiply。
如果不需要精确控制小数精度和/或更看重计算速度,可以考虑使用 multiply。
语法
参数
返回值
按指定小数精度进行乘法运算的结果。类型:Decimal256
示例
使用示例
与普通乘法的区别
十进制溢出
negate
自 v1.1 起引入
对参数 x 取负。结果始终为有符号数。
语法
参数
x— 要取相反数的值。
返回值
返回 -x(即 x 的相反数)
示例
用法示例
plus
引入版本:v1.1
计算两个值 x 和 y 的和。别名:x + y(运算符)。
可以将整数与日期,或整数与日期时间进行相加。前一种
操作会增加该日期中的天数,后一种操作会增加该日期时间中的秒数。
语法
参数
x— 左侧操作数。-y— 右侧操作数。
返回值
返回 x 和 y 的和。
示例
两个数相加
整数与日期相加
positiveModulo
引入自:v22.11
计算 x 除以 y 时的余数。类似于函数
modulo,但 positiveModulo 始终返回非负数。
语法
别名: positive_modulo, pmod
参数
返回值
返回 x 与不大于 x 且可被 y 整除的最近的整数之间的差值。
示例
使用示例
positiveModuloOrNull
引入于:v25.5
计算 a 被 b 除时的余数。与函数 positiveModulo 类似,但当右侧参数为 0 时,positiveModuloOrNull 将返回 NULL。
语法
别名: positive_modulo_or_null, pmodOrNull
参数
x— 被除数。(U)Int*/Float32/64。-y— 除数(模数)。(U)Int*/Float32/64。
返回值
返回 x 与不大于 x 且能被 y 整除的最近整数之间的差值;当除数为零时返回 null。
示例
positiveModuloOrNull