跳到主要内容
跳到主要内容

算数函数

算数函数适用于任何两个类型为 UInt8UInt16UInt32UInt64Int8Int16Int32Int64Float32Float64 的操作数。

在执行操作之前,两个操作数都被强制转换为结果类型。结果类型的确定方式如下(除非在下面的函数文档中另有说明):

  • 如果两个操作数的位宽都不超过32位,则结果类型的大小将为比两个操作数中较大者相应的下一个更大类型的大小(整数大小提升)。例如,UInt8 + UInt16 = UInt32Float32 * Float32 = Float64
  • 如果其中一个操作数的位数为64位或更高,则结果类型的大小将与两个操作数中较大的那一个相同。例如,UInt32 + UInt128 = UInt128Float32 * Float64 = Float64
  • 如果其中一个操作数为有符号,结果类型也将是有符号的,否则将为无符号。例如,UInt32 * Int32 = Int64

这些规则确保结果类型将是最小的能够表示所有可能结果的类型。虽然这在值范围边界周围引入了溢出的风险,但它确保了使用最大本机整数宽度64位快速执行计算。这种行为还保证与许多提供64位整数(BIGINT)作为最大整数类型的其他数据库的兼容性。

示例:

溢出产生的方式与 C++ 相同。

plus

计算两个值 ab 的和。

语法

可以将一个整数与日期或带时间的日期相加。前者操作会增加日期中的天数,后者操作则会增加带时间的日期中的秒数。

别名:a + b(运算符)

minus

计算两个值 ab 的差。结果始终为有符号。

plus 类似,可以从日期或带时间的日期中减去一个整数。

此外,支持带时间日期之间的减法,结果为它们之间的时间差。

语法

别名:a - b(运算符)

multiply

计算两个值 ab 的积。

语法

别名:a * b(运算符)

divide

计算两个值 ab 的商。结果类型始终为 Float64。整数除法由 intDiv 函数提供。

除以 0 将返回 inf-infnan

语法

别名: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 — 要检查无限的值。Float*
  • y — 回退值。Float*

返回值

  • 如果 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

返回两个值 ab 的最大公约数。

当除以零或将最小负数除以 -1 时会抛出异常。

语法

lcm(a, b)

返回两个值 ab 的最小公倍数。

当除以零或将最小负数除以 -1 时会抛出异常。

语法

max2

返回两个值 ab 中较大的一个。返回值的类型为 Float64

语法

示例

查询:

结果:

min2

返回两个值 ab 中较小的一个。返回值的类型为 Float64

语法

示例

查询:

结果:

multiplyDecimal

对两个小数 ab 进行乘法运算。结果值将为 Decimal256 类型。

结果的刻度可以通过 result_scale 明确指定。如果未指定 result_scale,则假设为输入值的最大刻度。

此函数的工作速度显著慢于普通 multiply。如果不需要控制结果精度和/或希望快速计算,可以考虑使用 multiply

语法

参数

  • a — 第一个值。Decimal
  • b — 第二个值。Decimal
  • result_scale — 结果的刻度。Int/UInt

返回值

  • 按给定刻度进行的乘法运算的结果。Decimal256

示例

与普通乘法的差异:

结果:

结果:

divideDecimal

对两个小数 ab 进行除法运算。结果值将为 Decimal256 类型。

结果的刻度可以通过 result_scale 明确指定。如果未指定 result_scale,则假设为输入值的最大刻度。

此函数的工作速度显著慢于普通 divide。如果不需要控制结果精度和/或希望快速计算,可以考虑使用 divide

语法

参数

  • a — 第一个值:Decimal
  • b — 第二个值:Decimal
  • result_scale — 结果的刻度:Int/UInt

返回值

  • 按给定刻度进行的除法运算的结果。Decimal256

示例

与普通除法的差异:

结果:

结果:

byteSwap

反转一个整数的字节,即更改其 字节序

语法

示例

结果:

上述示例可按以下方式计算:

  1. 将十进制整数转换为其大端格式的十六进制格式,即 3351772109 -> C7 C7 FB CD(4 字节)
  2. 反转字节,即 C7 C7 FB CD -> CD FB C7 C7
  3. 假设为大端,将结果转换回整数,即 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

语法

参数

  • x — 第一个值:Decimal
  • y — 第二个值:Decimal
  • result_scale — 结果的刻度。类型 Int/UInt

返回值

按给定刻度进行的除法运算的结果。类型: Decimal256

示例

示例 1

示例 2

gcd

引入于:v1.1

语法

参数

  • x — 第一个整数
  • y — 第二个整数

返回值

xy 的最大公约数。

示例

用法示例

ifNotFinite

引入于:v20.3

语法

参数

  • x — 检查是否为无限的值。Float32/Float64
  • y — 回退值。Float32/Float64

返回值

  • 如果 x 是有限的,则返回 x
  • 如果 x 不是有限的,则返回 y

示例

用法示例

intDiv

引入于:v1.1

语法

参数

  • x — 左操作数。
  • y — 右操作数。

返回值

xy 的整数除法结果

示例

两个浮点数的整数除法

商不适合被除数的范围

intDivOrZero

引入于:v1.1

语法

参数

  • a — 左操作数。
  • b — 右操作数。

返回值

ab 的整数除法结果,或零。

示例

以零进行整数除法

将最小负数除以负 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 — 第二个整数

返回值

xy 的最小公倍数。

示例

用法示例

max2

引入于:v21.11

语法

参数

  • x — 第一个值
  • y — 第二个值

返回值

返回 xy 中较大的值

示例

用法示例

min2

引入于:v21.11

语法

参数

  • x — 第一个值
  • y — 第二个值

返回值

返回 xy 中较小的值

示例

用法示例

minus

引入于:v1.1

语法

参数

  • x — 被减数
  • y — 减数

返回值

x 减去 y

示例

减去两个数字

减去整数和日期

modulo

引入于:v1.1

语法

参数

  • a — 被除数
  • b — 除数(模数)

返回值

a % b 的余数

示例

用法示例

moduloOrZero

引入于:v20.3

语法

参数

返回值

a % b 的余数,或者当除数为 0 时返回 0

示例

用法示例

multiply

引入于:v1.1

语法

参数

  • x — 因子
  • y — 因子

返回值

xy 的积

示例

乘以两个数字

multiplyDecimal

引入于:v22.12

语法

参数

  • a — 第一个值。类型 Decimal
  • b — 第二个值。类型 Decimal
  • result_scale — 结果的刻度。类型 Int/UInt

返回值

按给定刻度进行的乘法运算的结果。类型:Decimal256

示例

用法示例

与普通乘法的差异

小数溢出

negate

引入于:v1.1

语法

参数

  • x — 要取反的值。

返回值

返回 -x 从 x

示例

用法示例

plus

引入于:v1.1

语法

参数

  • x — 左操作数。
  • y — 右操作数。

返回值

xy 的和

示例

加上两个数字

加上一个整数和一个日期

positiveModulo

引入于:v22.11

语法

参数

返回值

返回 x 和不大于 x 的最近整数的差,该整数可被 y 整除。

示例

用法示例

positiveModuloOrNull

引入于:v22.11

语法

参数

返回值

返回 x 和不大于 x 的最近整数的差,该整数可被 y 整除;当除数为零时返回 null

示例

positiveModulo