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
按位与 (AND)
对两个相同类型的操作数执行按位 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)
对两个相同类型的操作数执行按位 OR
运算。支持的类型为整数和布尔值。操作数可以是标识符、常量、文字整数值或文字布尔值。
SELECT A | 5 FROM example
SELECT A | B FROM example
SELECT * FROM example WHERE "bitfield" | 12 = 12
按位异或 (Exclusive-OR)
对两个相同类型的操作数执行按位 Exclusive-OR
运算。支持的类型为整数和布尔值。操作数可以是标识符、常量、文字整数值或文字布尔值。
SELECT A ^ 255 FROM example
SELECT A ^ B FROM example
SELECT * FROM example WHERE "bitfield" ^ 6 > 0
不支持的运算符
不等式
在 SELECT
语句中使用 =
、!=
、<
、>
、<=
、>=
、<>
中的任何一个都会为所有类型产生空结果。比较运算符只能在 WHERE
子句中使用。
逻辑运算符
使用 !|
、NAND
、XOR
、NOR
中的任何一个都会产生解析器错误。
此外,在查询的 SELECT
子句中使用 AND
、OR
不会像数学运算符那样运行,而只会产生空结果,因为它们是 InfluxQL 令牌。但是,您可以将按位运算符 &
、|
和 ^
应用于布尔值。
按位非 (NOT)
没有按位非运算符,因为您期望的结果取决于位域的宽度。InfluxQL 不知道您的位域有多宽,因此无法实现合适的按位非运算符。
例如,如果您的位域为 8 位宽,则整数 1 表示位 0000 0001
。它的按位非应返回位 1111 1110
(即整数 254)。但是,如果您的位域为 16 位宽,则整数 1 表示位 0000 0000 0000 0001
。它的按位非应返回位 1111 1111 1111 1110
(即整数 65534)。
解决方案
您可以使用 ^
(按位异或)运算符以及表示您的字宽的所有位的数字来实现按位非运算。
对于 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 支持 子查询,它提供类似于在函数调用内部使用数学运算符的功能。
此页内容对您有帮助吗?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子!我们欢迎并鼓励您提供关于 InfluxDB 3 Core 和本文档的反馈和错误报告。要寻求支持,请使用以下资源
拥有年度或支持合同的客户可以联系 InfluxData 支持。