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"
将产生解析错误。
不支持的运算符
不等式
在 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
。
此页对您有帮助吗?
感谢您的反馈!