文档文档

InfluxQL 数学运算符

使用 InfluxQL 数学运算符在查询中执行数学运算。数学运算符遵循标准运算顺序。括号优先于除法和乘法,除法和乘法优先于加法和减法。例如 5 / 2 + 3 * 2 = (5 / 2) + (3 * 2)5 + 2 * 3 - 2 = 5 + (2 * 3) - 2

加法

使用常量执行加法。

SELECT "A" + 5 FROM "add"
SELECT * FROM "add" WHERE "A" + 5 > 10

对两个字段执行加法。

SELECT "A" + "B" FROM "add"
SELECT * FROM "add" WHERE "A" + "B" >= 10

减法

使用常量执行减法。

SELECT 1 - "A" FROM "sub"
SELECT * FROM "sub" WHERE 1 - "A" <= 3

使用两个字段执行减法。

SELECT "A" - "B" FROM "sub"
SELECT * FROM "sub" WHERE "A" - "B" <= 1

乘法

使用常量执行乘法。

SELECT 10 * "A" FROM "mult"
SELECT * FROM "mult" WHERE "A" * 10 >= 20

使用两个字段执行乘法。

SELECT "A" * "B" * "C" FROM "mult"
SELECT * FROM "mult" WHERE "A" * "B" <= 80

乘法在其他运算符之间分配。

SELECT 10 * ("A" + "B" + "C") FROM "mult"
SELECT 10 * ("A" - "B" - "C") FROM "mult"
SELECT 10 * ("A" + "B" - "C") FROM "mult"

除法

使用常量执行除法。

SELECT 10 / "A" FROM "div"
SELECT * FROM "div" WHERE "A" / 10 <= 2

使用两个字段执行除法。

SELECT "A" / "B" FROM "div"
SELECT * FROM "div" WHERE "A" / "B" >= 10

除法在其他运算符之间分配。

SELECT 10 / ("A" + "B" + "C") FROM "mult"

取模

使用常量执行取模运算。

SELECT "B" % 2 FROM "modulo"
SELECT "B" FROM "modulo" WHERE "B" % 2 = 0

对两个字段执行取模运算。

SELECT "A" % "B" FROM "modulo"
SELECT "A" FROM "modulo" WHERE "A" % "B" = 0

按位与

您可以将此运算符与任何整数或布尔值一起使用,无论它们是字段还是常量。它不适用于浮点或字符串数据类型,并且您不能混合使用整数和布尔值。

SELECT "A" & 255 FROM "bitfields"
SELECT "A" & "B" FROM "bitfields"
SELECT * FROM "data" WHERE "bitfield" & 15 > 0
SELECT "A" & "B" FROM "booleans"
SELECT ("A" ^ true) & "B" FROM "booleans"

按位或

您可以将此运算符与任何整数或布尔值一起使用,无论它们是字段还是常量。它不适用于浮点或字符串数据类型,并且您不能混合使用整数和布尔值。

SELECT "A" | 5 FROM "bitfields"
SELECT "A" | "B" FROM "bitfields"
SELECT * FROM "data" WHERE "bitfield" | 12 = 12

按位异或

您可以将此运算符与任何整数或布尔值一起使用,无论它们是字段还是常量。它不适用于浮点或字符串数据类型,并且您不能混合使用整数和布尔值。

SELECT "A" ^ 255 FROM "bitfields"
SELECT "A" ^ "B" FROM "bitfields"
SELECT * FROM "data" WHERE "bitfield" ^ 6 > 0

不支持的运算符

不等式

SELECT 语句中使用 =!=<><=>=<> 中的任何一个都会为所有类型产生空结果。比较运算符只能在 WHERE 子句中使用。

逻辑运算符

使用 !|NANDXORNOR 中的任何一个都会产生解析器错误。

此外,在查询的 SELECT 子句中使用 ANDOR 不会像数学运算符那样起作用,只会产生空结果,因为它们是 InfluxQL 中的标记。但是,您可以将按位运算符 &|^ 应用于布尔数据。

按位非

没有按位非运算符,因为您期望的结果取决于您的位字段的宽度。InfluxQL 不知道您的位字段有多宽,因此无法实现合适的按位非运算符。

例如,如果您的位字段是 8 位宽,那么对于您来说,整数 1 表示位 0000 0001。此值的按位非应返回位 1111 1110,即整数 254。

但是,如果您的位字段是 16 位宽,那么整数 1 表示位 0000 0000 0000 0001。此值的按位非应返回位 1111 1111 1111 1110,即整数 65534。

解决方案

您可以通过将 ^(按位异或)运算符与表示您的字宽的所有 1 的数字一起使用来实现按位非运算

对于 8 位数据

SELECT "A" ^ 255 FROM "data"

对于 16 位数据

SELECT "A" ^ 65535 FROM "data"

对于 32 位数据

SELECT "A" ^ 4294967295 FROM "data"

在每种情况下,您需要的常量都可以计算为 (2 ** width) - 1

数学运算符的常见问题

带有通配符和正则表达式的数学运算符

InfluxDB 不支持在 SELECT 子句中将数学运算与通配符 (*) 或正则表达式 组合使用。以下查询无效,系统会返回错误

对通配符执行数学运算。

SELECT * + 2 FROM "nope"
-- ERR: unsupported expression with wildcard: * + 2

对函数内的通配符执行数学运算。

SELECT COUNT(*) / 2 FROM "nope"
-- ERR: unsupported expression with wildcard: count(*) / 2

对正则表达式执行数学运算。

SELECT /A/ + 2 FROM "nope"
-- ERR: error parsing query: found +, expected FROM at line 1, char 12

对函数内的正则表达式执行数学运算。

SELECT COUNT(/A/) + 2 FROM "nope"
-- ERR: unsupported expression with regex field: count(/A/) + 2

带有函数的数学运算符

当前不支持在函数调用内部使用数学运算符。请注意,InfluxDB 仅允许在 SELECT 子句中使用函数。

例如,以下操作有效

SELECT 10 * mean("value") FROM "cpu"

但是,以下查询将返回解析错误

SELECT mean(10 * "value") FROM "cpu"
-- Error: expected field argument in mean()

InfluxQL 支持子查询,它提供类似于在函数调用内部使用数学运算符的功能。


此页面是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像现在这样使用它,而无需对您的代码进行任何更改。

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、最近数据引擎,可实时收集和处理数据,并将其持久化到本地磁盘或对象存储。InfluxDB 3 Enterprise 构建在 Core 的基础上,增加了高可用性、读取副本、增强的安全性以及数据压缩,从而实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看