Documentation

InfluxQL 数学运算符

InfluxDB 3核心正在进行公开测试

InfluxDB 3 Core 正在进行公开 alpha 测试,并可供测试和反馈,但不适合用于生产环境。产品和本文件都是进行中的工作。我们欢迎并鼓励您分享您对 alpha 版本的体验,并邀请您加入我们的公共频道以获取更新和分享反馈。

阿尔法预期和建议

在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

按位与

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

SELECT A & 255 FROM example

SELECT A & B FROM example

SELECT (A ^ true) & B FROM example

SELECT * FROM example WHERE A & 15 > 0

按位或

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

SELECT A | 5 FROM example

SELECT A | B FROM example

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

按位异或

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

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()

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



Flux的未来

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

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

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

有关如何开始的更多信息,请查看: