文档文档

InfluxQL 数学运算符

此页面记录了早期版本的 InfluxDB OSS。 InfluxDB OSS v2 是最新的稳定版本。请参阅 InfluxDB v2 文档

数学运算符遵循 标准运算顺序。也就是说,括号的优先级高于除法和乘法,除法和乘法的优先级高于加法和减法。例如 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

数学运算符的常见问题

问题 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

问题 2:带有函数的数学运算符

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

例如

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

将起作用,但是

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

将产生解析错误。

InfluxQL 支持 子查询,它提供类似于在函数调用内部使用数学运算符的功能。有关更多信息,请参阅 数据探索

不支持的运算符

不等式

SELECT 子句中使用 =,!=,<,>,<=,>=,<> 中的任何一个都会为所有类型产生空结果。请参阅 GitHub 问题 3525

逻辑运算符

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

此外,在查询的 SELECT 子句中使用 AND, OR 不会像数学运算符那样运行,只会产生空结果,因为它们是 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


此页对您有帮助吗?

感谢您的反馈!


Flux 的未来

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

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

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

有关更多信息,请查看