文档说明

InfluxQL数学运算符

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

加法

对两个数字操作数进行加法。操作数可以是标识符、常数或字面数值。

SELECT A + 5 FROM example

SELECT A + B FROM example

SELECT * FROM example WHERE A + 5 > 10

SELECT * FROM example WHERE A + B > 10

减法

从一个数字操作数减去另一个数字操作数。操作数可以是标识符、常数或字面数值。

SELECT 1 - A FROM example

SELECT B - A FROM example

SELECT * FROM example WHERE 1 - A <= 3

SELECT * FROM example WHERE B - A <= 3

乘法

对两个数字操作数进行乘法。操作数可以是标识符、常数或字面数值。

SELECT A * 10 FROM example

SELECT A * B FROM example

SELECT * FROM example WHERE A * 10 >= 20

SELECT * FROM example WHERE A * B >= 20

乘法在除法和乘法操作中分配。

SELECT 10 * (A + B + C) FROM example

SELECT 10 * (A - B - C) FROM example

SELECT 10 * (A + B - C) FROM example

除法

用一个数字操作数除以另一个数字操作数。操作数可以是标识符、常数或字面数值。

SELECT A / 10 FROM example

SELECT A / B FROM example

SELECT * FROM example WHERE A / 10 <= 2

SELECT * FROM example WHERE A / B <= 2

除法在除法和乘法操作中分配。

SELECT 10 / (A + B + C) FROM example

SELECT 10 / (A - B - C) FROM example

SELECT 10 / (A + B - C) FROM example

取模

对两个数字操作数执行取模运算。操作数可以是标识符、常数或字面数值。

SELECT A % 2 FROM example

SELECT A % B FROM example

SELECT A FROM example WHERE A % 2 = 0

SELECT A, B FROM example WHERE A % B = 0

按位与

对两个相同类型的操作数执行按位与操作。支持的类型是整数布尔值。操作数可以是标识符、常数、字面整数值或字面布尔值。

SELECT A & 255 FROM example

SELECT A & B FROM example

SELECT (A ^ true) & B FROM example

SELECT * FROM example WHERE A & 15 > 0

按位或

对两个相同类型的操作数执行按位或操作。支持的类型是整数布尔值。操作数可以是标识符、常数、字面整数值或字面布尔值。

SELECT A | 5 FROM example

SELECT A | B FROM example

SELECT * FROM example WHERE "bitfield" | 12 = 12

按位异或

对两个相同类型的操作数执行按位异或操作。支持的类型是整数布尔值。操作数可以是标识符、常数、字面整数值或字面布尔值。

SELECT A ^ 255 FROM example

SELECT A ^ B FROM example

SELECT * FROM example 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 example

对于 16 位数据

SELECT A ^ 65535 FROM example

对于 32 位数据

SELECT A ^ 4294967295 FROM example

在这种情况下,您所需的常数可以通过 (2 ** width) - 1 来计算。

数学运算符的显著行为

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

InfluxQL 不支持在 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

带函数的数学运算符

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

例如,以下操作将正常工作

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

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

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

这个页面有帮助吗?

感谢您的反馈!


Flux 的未来

Flux 正在进入维护模式。您可以在不更改现有代码的情况下继续使用它。

阅读更多

InfluxDB v3 增强功能和 InfluxDB Clustered 现已正式发布

新功能,包括更快的查询性能和管理工具,推动了 InfluxDB v3 产品线的进步。InfluxDB Clustered 现已正式发布。

InfluxDB v3 性能和功能

InfluxDB v3产品系列在查询性能方面取得了显著提升,并提供了新的管理工具。这些增强功能包括用于监控InfluxDB集群健康状况的操作仪表板、InfluxDB云专用版中的单点登录(SSO)支持,以及用于令牌和数据库的新管理API。

了解v3的新增强功能


InfluxDB集群版现已全面上市

InfluxDB集群版现已全面上市,为您在自管理堆栈中提供了InfluxDB v3的功能。

与我们讨论InfluxDB集群版