算数函数
算数函数适用于任何两个类型为 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
。
这些规则确保结果类型将是最小的能够表示所有可能结果的类型。虽然这在值范围边界周围引入了溢出的风险,但它确保了使用最大本机整数宽度64位快速执行计算。这种行为还保证与许多提供64位整数(BIGINT)作为最大整数类型的其他数据库的兼容性。
示例:
溢出产生的方式与 C++ 相同。
plus
计算两个值 a
和 b
的和。
语法
可以将一个整数与日期或带时间的日期相加。前者操作会增加日期中的天数,后者操作则会增加带时间的日期中的秒数。
别名:a + b
(运算符)
minus
计算两个值 a
和 b
的差。结果始终为有符号。
与 plus
类似,可以从日期或带时间的日期中减去一个整数。
此外,支持带时间日期之间的减法,结果为它们之间的时间差。
语法
别名:a - b
(运算符)
multiply
计算两个值 a
和 b
的积。
语法
别名:a * b
(运算符)
divide
计算两个值 a
和 b
的商。结果类型始终为 Float64。整数除法由 intDiv
函数提供。
除以 0 将返回 inf
、-inf
或 nan
。
语法
别名:a / b
(运算符)
divideOrNull
如同 divide,但当除数为零时返回 null。
语法
intDiv
执行两个值 a
除以 b
的整数除法,即计算向下取整到下一个最小整数的商。
结果的宽度与被除数(第一个参数)相同。
当除以零、商不适合被除数的范围或者将最小负数除以 -1 时会抛出异常。
语法
示例
查询:
intDivOrZero
与 intDiv
相同,但在除以零或将最小负数除以 -1 时返回零。
语法
intDivOrNull
如同 intDiv,但当除数为零时返回 null。
语法
isFinite
如果 Float32 或 Float64 参数不是无限大且不是 NaN,则返回 1;否则该函数返回 0。
语法
isInfinite
如果 Float32 或 Float64 参数是无限大,则返回 1;否则该函数返回 0。注意 NaN 会返回 0。
语法
ifNotFinite
检查浮点值是否有限。
语法
参数
返回值
- 如果
x
是有限的,则返回x
。 - 如果
x
不是有限的,则返回y
。
示例
查询:
SELECT 1/0 as infimum, ifNotFinite(infimum,42)
结果:
┌─infimum─┬─ifNotFinite(divide(1, 0), 42)─┐ │ inf │ 42 │ └─────────┴───────────────────────────────┘
您可以通过使用 三元运算符 获取类似结果:isFinite(x) ? x : y
。
isNaN
如果 Float32 和 Float64 参数是 NaN,则返回 1;否则该函数返回 0。
语法
modulo
计算两值 a
除以 b
的余数。
如果两个输入都是整数,则结果类型为整数。如果其中一个输入是浮点数,则结果类型为 Float64。
余数的计算方式与 C++ 相同。对负数使用截断除法。
当除以零或将最小负数除以 -1 时会抛出异常。
语法
别名:a % b
(运算符)
moduloOrZero
如同 modulo,但当除数为零时返回零。
语法
moduloOrNull
如同 modulo,但当除数为零时返回 null。
语法
positiveModulo(a, b)
如同 modulo,但始终返回非负数。
此函数比 modulo
慢 4-5 倍。
语法
别名:
positive_modulo(a, b)
pmod(a, b)
示例
查询:
结果:
positiveModuloOrNull(a, b)
如同 positiveModulo,但当除数为零时返回 null。
语法
negate
对值 a
取反。结果始终为有符号。
语法
别名:-a
abs
计算 a
的绝对值。如果 a
为无符号类型,则无效。如果 a
为有符号类型,则返回无符号数。
语法
gcd
返回两个值 a
和 b
的最大公约数。
当除以零或将最小负数除以 -1 时会抛出异常。
语法
lcm(a, b)
返回两个值 a
和 b
的最小公倍数。
当除以零或将最小负数除以 -1 时会抛出异常。
语法
max2
返回两个值 a
和 b
中较大的一个。返回值的类型为 Float64。
语法
示例
查询:
结果:
min2
返回两个值 a
和 b
中较小的一个。返回值的类型为 Float64。
语法
示例
查询:
结果:
multiplyDecimal
对两个小数 a
和 b
进行乘法运算。结果值将为 Decimal256 类型。
结果的刻度可以通过 result_scale
明确指定。如果未指定 result_scale
,则假设为输入值的最大刻度。
此函数的工作速度显著慢于普通 multiply
。如果不需要控制结果精度和/或希望快速计算,可以考虑使用 multiply
。
语法
参数
返回值
- 按给定刻度进行的乘法运算的结果。Decimal256。
示例
与普通乘法的差异:
结果:
结果:
divideDecimal
对两个小数 a
和 b
进行除法运算。结果值将为 Decimal256 类型。
结果的刻度可以通过 result_scale
明确指定。如果未指定 result_scale
,则假设为输入值的最大刻度。
此函数的工作速度显著慢于普通 divide
。如果不需要控制结果精度和/或希望快速计算,可以考虑使用 divide
。
语法
参数
返回值
- 按给定刻度进行的除法运算的结果。Decimal256。
示例
与普通除法的差异:
结果:
结果:
byteSwap
反转一个整数的字节,即更改其 字节序。
语法
示例
结果:
上述示例可按以下方式计算:
- 将十进制整数转换为其大端格式的十六进制格式,即 3351772109 -> C7 C7 FB CD(4 字节)
- 反转字节,即 C7 C7 FB CD -> CD FB C7 C7
- 假设为大端,将结果转换回整数,即 CD FB C7 C7 -> 3455829959
此函数的一个用例是反转 IPv4:
abs
引入于:v1.1
语法
参数
x
— 要获取绝对值的值
返回值
x
的绝对值
示例
用法示例
byteSwap
引入于:v23.10
语法
参数
x
— 一个整数值。
返回值
x 的字节反转
示例
用法示例
8位
16位
32位
64位
divide
引入于:v1.1
语法
参数
x
— 被除数y
— 除数
返回值
x 和 y 的商
示例
除法计算
除以零
divideDecimal
引入于:v22.12
语法
参数
返回值
按给定刻度进行的除法运算的结果。类型: Decimal256。
示例
示例 1
示例 2
gcd
引入于:v1.1
语法
参数
x
— 第一个整数y
— 第二个整数
返回值
x
和 y
的最大公约数。
示例
用法示例
ifNotFinite
引入于:v20.3
语法
参数
x
— 检查是否为无限的值。Float32/Float64y
— 回退值。Float32/Float64
返回值
- 如果
x
是有限的,则返回x
。 - 如果
x
不是有限的,则返回y
。
示例
用法示例
intDiv
引入于:v1.1
语法
参数
x
— 左操作数。y
— 右操作数。
返回值
x
和 y
的整数除法结果
示例
两个浮点数的整数除法
商不适合被除数的范围
intDivOrZero
引入于:v1.1
语法
参数
a
— 左操作数。b
— 右操作数。
返回值
a
和 b
的整数除法结果,或零。
示例
以零进行整数除法
将最小负数除以负 1
isFinite
引入于:v1.1
语法
参数
x
— 检查有限性的数字。Float32 或 Float64。
返回值
如果 x 不是无限大且不是 NaN
,则返回 1
,否则返回 0
。
示例
测试数字是否有限
isInfinite
引入于:v1.1
语法
参数
x
— 检查无限性的数字。Float32 或 Float64。
返回值
如果 x 是无限大,则返回 1
,否则返回 0
(包括 NaN
的情况)。
示例
测试数字是否无限
isNaN
引入于:v1.1
语法
参数
x
— 要评估是否为NaN
的参数
返回值
如果为 NaN
则返回 1
,否则返回 0
示例
用法示例
lcm
引入于:v1.1
语法
参数
x
— 第一个整数y
— 第二个整数
返回值
x
和 y
的最小公倍数。
示例
用法示例
max2
引入于:v21.11
语法
参数
x
— 第一个值y
— 第二个值
返回值
返回 x
和 y
中较大的值
示例
用法示例
min2
引入于:v21.11
语法
参数
x
— 第一个值y
— 第二个值
返回值
返回 x
和 y
中较小的值
示例
用法示例
minus
引入于:v1.1
语法
参数
x
— 被减数y
— 减数
返回值
x 减去 y
示例
减去两个数字
减去整数和日期
modulo
引入于:v1.1
语法
参数
a
— 被除数b
— 除数(模数)
返回值
a % b
的余数
示例
用法示例
moduloOrZero
引入于:v20.3
语法
参数
a
— 被除数。(U)Int*
/Float32/64
。b
— 除数(模数)。(U)Int*
/Float32/64
。
返回值
a % b
的余数,或者当除数为 0
时返回 0
。
示例
用法示例
multiply
引入于:v1.1
语法
参数
x
— 因子y
— 因子
返回值
x
和 y
的积
示例
乘以两个数字
multiplyDecimal
引入于:v22.12
语法
参数
返回值
按给定刻度进行的乘法运算的结果。类型:Decimal256。
示例
用法示例
与普通乘法的差异
小数溢出
negate
引入于:v1.1
语法
参数
x
— 要取反的值。
返回值
返回 -x 从 x
示例
用法示例
plus
引入于:v1.1
语法
参数
x
— 左操作数。y
— 右操作数。
返回值
x
和 y
的和
示例
加上两个数字
加上一个整数和一个日期
positiveModulo
引入于:v22.11
语法
参数
x
— 被除数。(U)Int*
/Float32/64
。y
— 除数(模数)。(U)Int*
/Float32/64
。
返回值
返回 x
和不大于 x
的最近整数的差,该整数可被 y
整除。
示例
用法示例
positiveModuloOrNull
引入于:v22.11
语法
参数
x
— 被除数。(U)Int*
/Float32/64
。x
— 除数(模数)。(U)Int*
/Float32/64
。
返回值
返回 x
和不大于 x
的最近整数的差,该整数可被 y
整除;当除数为零时返回 null
。
示例
positiveModulo