InfluxQL 数学运算符
数学运算符遵循标准运算顺序。即,括号优先于除法和乘法,除法和乘法优先于加法和减法。例如 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。
解决方案
你可以通过使用 ^ (按位异或) 运算符与表示全一的数字来实现按位非操作,适用于你的字宽:
对于8位数据:
SELECT "A" ^ 255 FROM "data"
对于16位数据:
SELECT "A" ^ 65535 FROM "data"
对于32位数据:
SELECT "A" ^ 4294967295 FROM "data"
在每种情况下,您需要的常量可以计算为 (2 ** width) - 1。