ルールエンジンを使用するとき、データが JSON 形式の場合は、SQL 文を記述してデータを解析し、解析結果を処理することができます。 ルールエンジンはバイナリデータを解析せず、バイナリデータはそのままパススルーします。 ここでは、SQL 文について説明します。

SQL 文

JSON データは仮想テーブルにマッピングできます。 JSON データレコードのキーは列名に対応し、JSON データレコードの値は列の値に対応します。 仮想テーブルにマップされれば、JSON データレコードは SQL を使用して処理できます。 以下、ルールエンジンから SQL 文にルールを抽象化する例を示します。





たとえば、環境センサー (通常、火災の検出、ならびに温度、湿度、および大気圧データの収集に使用される) では、次のデータが送信されます。
{
"temperature":25.1
"humidity":65
"pressure":101.5
"location":"xxx,xxx"
}
気温が 38℃を超え、湿度が 40%RH を下回ったときに起動するアラームを設定する場合、ルールとして次の SQL 文を記述します: "SELECT temperature as t, deviceName() as deviceName, location FROM /ProductA/+/update WHERE temperature > 38 and humidity < 40"
その後、送信されたデータがルールパラメーターを満たしている場合、ルールがトリガーされ、データレコード内の温度、デバイス名、および場所が、以後の処理のために解析されます。

FROM

FROM 文を使用するにあたっては、処理されるメッセージを含むトピックに合致させるため、FROM の後にトピックのワイルドカードを指定する必要があります。 これは、指定されたトピックに付随するメッセージが到着したとき、JSON 形式のメッセージペイロードだけが解析され、定義された SQL 文で処理されることを意味します。 メッセージ形式が無効な場合、メッセージは無視されます。 topic() を使用すると、特定のトピックを参照できます。

この例で、"FROM /ProductA/+/update" という文は、 "/ProductA/+/update" という条件に合致するメッセージのみが処理されることを示しています。 メッセージとトピックの合致の詳細については、「トピック」 をご参照ください。
			

SELECT

  • JSON データ

    SELECT 文では、送信されたメッセージのペイロードの解析結果を特定できます。これは、JSON データのキーと値を表します。 deviceName() などの組み込み関数を SQL 文で使用することもできます。 SQL サブクエリはサポートされていません。

    送信される JSON データは、配列またはネストされた JSON データである可能性があります。 また、JSONPath 式を使用して、送信されたデータレコードのキー値を取得することもできます。 たとえば、ペイロードが {a:{key1:v1, key2:v2}} の場合、JSON パスとして a.key2 を指定することによって、v2 の値を取得できます。 SQL 文で変数を指定する場合は、一重引用符 (') と二重引用符 (") の使用法の違いに注意してください。 一重引用符 (') は定数を囲みます。 二重引用符 (") は変数を囲みます。 変数は、引用符で囲まずに書くこともできます。 たとえば、'a.key2' のように、変数を一重引用符 (') で囲むと、a.key2 は定数と解釈されます。

    組み込み関数の詳細については、「関数」をご参照ください。

    前述の例にある "SELECT temperature as t, deviceName() as deviceName, location" という文では、temperature と location は送信されたメッセージのフィールドであり、deviceName() は組み込み関数です。
    					
  • バイナリデータ
    • バイナリデータを直接渡すには * を入力してください。
    • 関数 to_base64(*) を使用して、元のペイロードのバイナリデータを base64 文字列に変換します。 必要な情報を抽出するために、deviceName() のような組み込み関数と条件がサポートされています。

WHERE

  • JSON データ

    WHERE 句は、ルールをトリガーする条件として使用されます。 SQL サブクエリはサポートされていません。 WHERE 句で使用できるフィールドは、SELECT 文で使用できるフィールドと同じです。 対応するトピックのメッセージが受信されると、WHERE 句を使用して得られた結果が、ルールがトリガーされるかどうかを判断するために使用されます。 WHERE 式の詳細については、次の表 (サポートされている WHERE 式) をご参照ください。

    前の例では、"WHERE temperature > 38 and humidity < 40" は、温度が 38℃より高く、湿度が 40%RH 未満の場合にルールがトリガーされることを示します。
  • バイナリデータ

    送信されたメッセージがバイナリデータで構成されている場合、WHERE 句で使用できるのは組み込み関数と WHERE 式だけです。 送信されたメッセージのペイロード内のフィールドは使用できません。

SQL 処理結果

SQL 文の実行後に返される SQL 処理結果は転送されます。 送信されたメッセージのペイロードを解析中にエラーが発生すると、ルールの実行は失敗します。 データ転送に使用する式で、転送するデータを指定するには、${expression} を使用する必要があります。

前の例では、データ転送アクションを設定するときに、"${t}"、"${deviceName}"、および "${location}" を使用して SQL 処理結果を参照できます。 たとえば、SQL処理結果を Table Store に転送する場合は、"${t}"、"${deviceName}"、および "${location}" を使用できます。
			

配列の使用に関する注意

SQL 文で配列を参照する場合は、二重引用符 (") を使用します。 たとえば、メッセージが {a:[{v:1},{v:2},{v:3}]} の場合、SELECT 文は select "$.a[0]" data1,".a[1].v" data2,".a[2]" data3 となり、これは data1={v:1}data2=2、および data3=[{v:3}] を示します。

サポートされる WHERE 式

演算子 説明
= 等しい color = ‘red’
<> 等しくない color <> ‘red’
AND 論理積 color = ‘red’ AND siren = ‘on’
OR 論理和 color = ‘red’ OR siren = ‘on’
( ) 括弧の内側は、全体が 1 つの条件として評価されます。 color = ‘red’ AND (siren = ‘on’ OR isTest)
+ 加算 4 + 5
- 減算 5-4
/ 除算 20 / 4
* 乗算 5 * 4
% 余りを返す 20% 6
< より小さい 5 < 6
<= 以下 5 <= 6
> より大きい 6 > 5
>= 以上 6 >= 5
関数呼び出し サポートされる関数の詳細については、「関数」をご参照ください。 deviceId()
JSON 形式で表現された属性 メッセージのペイロードから属性を抽出し、JSON 形式で表現できます。 state.desired.color,a.b.c[0].d
CASE … WHEN … THEN … ELSE … END CASE 式 CASE col WHEN 1 THEN ‘Y’ WHEN 0 THEN ‘N’ ELSE ‘’ END as flag
IN 値のリストのみがサポートされています。 サブクエリはサポートされていません。 たとえば、WHERE a IN (1, 2, 3) を使用できます。 ただし、WHERE a IN (select xxx) を使用することはできません。
LIKE LIKE 演算子は、指定されたパターンを検索するために使用されます。 LIKE 演算子を使用する場合は、任意の文字列を表すには、ワイルドカード文字 % のみ使用できます。 たとえば、WHERE c1 LIKE '%abc' や WHERE c1 not like LIVE '%def%' のように LIKE 演算子を使用できます。