数値演算は、標準の演算子の優先順位に基づいて実行されます。括弧は除算と乗算よりも優先され、除算と乗算は加算と減算よりも優先されます。
数値演算子
加算
次のコードは、定数を使用して加算する方法の例を示しています。
SELECT "A" + 5 FROM "add"SELECT * FROM "add" WHERE "A" + 5 > 10次のコードは、2 つのフィールドを使用して加算する方法の例を示しています。
SELECT "A" + "B" FROM "add"SELECT * FROM "add" WHERE "A" + "B" >= 10減算
次のコードは、定数を使用して減算する方法の例を示しています。
SELECT 1 - "A" FROM "sub"SELECT * FROM "sub" WHERE 1 - "A" <= 3次のコードは、2 つのフィールドを使用して減算する方法の例を示しています。
SELECT "A" - "B" FROM "sub"SELECT * FROM "sub" WHERE "A" - "B" <= 1乗算
次のコードは、定数を使用して乗算する方法の例を示しています。
SELECT 10 * "A" FROM "mult"SELECT * FROM "mult" WHERE "A" * 10 >= 20次のコードは、2 つのフィールドを使用して乗算する方法の例を示しています。
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次のコードは、2 つのフィールドを使用して除算する方法の例を示しています。
SELECT "A" / "B" FROM "div"SELECT * FROM "div" WHERE "A" / "B" >= 10除算は他の演算子に分配されます。
SELECT 10 / ("A" + "B" + "C") FROM "div"剰余
次のコードは、定数を使用して剰余演算を実行する方法の例を示しています。
SELECT "B" % 2 FROM "modulo"SELECT "B" FROM "modulo" WHERE "B" % 2 = 0次のコードは、2 つのフィールドを使用して剰余演算を実行する方法の例を示しています。
SELECT "A" % "B" FROM "modulo"SELECT "A" FROM "modulo" WHERE "A" % "B" = 0ビット単位 AND
この演算子を使用して、INTEGER 型または BOOLEAN 型のフィールドまたは定数を処理できます。 この演算子は、浮動小数点数または文字列には使用できず、整数とブール値を一緒に指定することはできません。
SELECT "A" & 255 FROM "bitfields"SELECT "A" & "B" FROM "bitfields"SELECT * FROM "data" WHERE "bitfield" & 15 > 0SELECT "A" & "B" FROM "booleans"SELECT ("A" ^ true) & "B" FROM "booleans"ビット単位 OR
この演算子を使用して、INTEGER 型または BOOLEAN 型のフィールドまたは定数を処理できます。 この演算子は、浮動小数点数または文字列には使用できず、整数とブール値を一緒に指定することはできません。
SELECT "A" | 5 FROM "bitfields"SELECT "A" | "B" FROM "bitfields"SELECT * FROM "data" WHERE "bitfield" | 12 = 12ビット単位排他的 OR
この演算子を使用して、INTEGER 型または BOOLEAN 型のフィールドまたは定数を処理できます。 この演算子は、浮動小数点数または文字列には使用できず、整数とブール値を一緒に指定することはできません。
SELECT "A" ^ 255 FROM "bitfields"SELECT "A" ^ "B" FROM "bitfields"SELECT * FROM "data" WHERE "bitfield" ^ 6 > 0一般的な問題
数値演算子とワイルドカードまたは正規表現を同時に使用する
Time Series Database (TSDB) for 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数値演算子と関数を同時に使用する
数値演算子は関数呼び出しでは使用できません。 TSDB for InfluxDB® は、SELECT 句でのみ関数の使用をサポートしています。
次のコードは例を示しています。
SELECT 10 * mean("value") FROM "cpu"ステートメントが実行され、パーサーエラーが発生します。
SELECT mean(10 * "value") FROM "cpu"InfluxQL はサブクエリをサポートしています。 サブクエリは、関数呼び出し内で数値演算子を使用するのと同様の機能を提供します。 詳細については、「データ探索」をご参照ください。
サポートされていない演算子
等価と不等価
=、!=、<、>、<=、>=、または <> を SELECT 句で使用すると、データ型に関係なく、空の結果が返されます。
論理演算子
ステートメントで !|、NAND、XOR、または NOR を使用すると、パーサーエラーが発生します。
さらに、SELECT 句で AND または OR を使用すると、数値演算は実行されず、空の結果が返されます。 これは、AND と OR が InfluxQL のトークンであるためです。 ただし、ビット単位演算子 &、|、および ^ を使用して BOOLEAN データを処理できます。
ビット単位 NOT
InfluxQL は、ビット単位 NOT 演算子を提供していません。 結果は、ビットフィールドの幅に基づいて計算されます。 InfluxQL はビットフィールドの幅を認識しないため、適切なビット単位 NOT 演算子を提供できません。
たとえば、ビットフィールドの幅が 8 ビットの場合、整数 1 はビット 0000 0001 を表します。 ビット単位 NOT 演算が実行された後、ビット 1111 1110 が返されます。 返されたビットは整数 254 を表します。
ただし、ビットフィールドの幅が 16 ビットの場合、整数 1 はビット 0000 0000 0000 0001 を指定します。 ビット単位 NOT 演算が完了した後、ビット 1111 1111 1111 1110 が返されます。 返されたビットは整数 65534 を表します。
解決策
ビット単位 NOT 演算を実行するには、^ ビット単位 XOR 演算子を使用し、幅をすべてのビットの値を示す数値に設定します。 指定するビットフィールドの幅は、すべてのビットの値が 1 であることを示す数値である必要があります。
次のコードは、8 ビットデータの例を示しています。
SELECT "A" ^ 255 FROM "data"次のコードは、16 ビットデータの例を示しています。
SELECT "A" ^ 65535 FROM "data"次のコードは、32 ビットデータの例を示しています。
SELECT "A" ^ 4294967295 FROM "data"いずれの場合も、(2 ** 幅) - 1 という式を使用して、必要な定数を計算できます。