文档文档

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

逻辑运算符

使用 !|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


此页对您有帮助吗?

感谢您的反馈!


Flux 的未来

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

阅读更多

InfluxDB 3 开源现已公开发布 Alpha 版本

InfluxDB 3 开源现在可用于 alpha 测试,根据 MIT 或 Apache 2 许可获得许可。

我们正在发布两个产品作为 alpha 版本的一部分。

InfluxDB 3 Core 是我们的新开源产品。它是用于时间序列和事件数据的最新数据引擎。 InfluxDB 3 Enterprise 是一个商业版本,它建立在 Core 的基础上,增加了历史查询功能、读取副本、高可用性、可扩展性和细粒度的安全性。

有关如何入门的更多信息,请查看