創(chuàng)建數(shù)據(jù)流轉(zhuǎn)規(guī)則時(shí),需編寫(xiě)SQL來(lái)解析和處理設(shè)備上報(bào)的JSON數(shù)據(jù)。二進(jìn)制格式的數(shù)據(jù)不做解析,直接透?jìng)鳌1疚闹饕榻B如何編寫(xiě)數(shù)據(jù)流轉(zhuǎn)規(guī)則的SQL表達(dá)式。

SQL表達(dá)式

重要 若物模型標(biāo)識(shí)符以數(shù)字開(kāi)頭,不支持使用SQL表達(dá)式訪問(wèn)該物模型,即舊版云產(chǎn)品流轉(zhuǎn)功能不支持流轉(zhuǎn)標(biāo)識(shí)符以數(shù)字開(kāi)頭的物模型數(shù)據(jù)。

您可使用新版云產(chǎn)品流轉(zhuǎn)功能,通過(guò)編輯腳本訪問(wèn)標(biāo)識(shí)符以數(shù)字開(kāi)頭的物模型,進(jìn)行數(shù)據(jù)流轉(zhuǎn)。具體內(nèi)容,請(qǐng)參見(jiàn)腳本編寫(xiě)說(shuō)明

JSON數(shù)據(jù)可以映射為虛擬的表,其中Key對(duì)應(yīng)表的列,Value對(duì)應(yīng)列值,因此可以使用SQL來(lái)進(jìn)行數(shù)據(jù)處理。數(shù)據(jù)流轉(zhuǎn)規(guī)則的SQL表達(dá)示意圖如下:

SQL表達(dá)式

數(shù)據(jù)流轉(zhuǎn)規(guī)則SQL示例:

  • 處理自定義Topic數(shù)據(jù)的SQL示例。

    某環(huán)境傳感器可以采集溫度、濕度及氣壓數(shù)據(jù)。設(shè)備上報(bào)到自定義Topic:/a1hRrzD****/+/user/update的數(shù)據(jù)如下:

    {
        "temperature":25.1,
        "humidity":65,
        "pressure":101.5,
        "location":"***,***"
    }

    設(shè)置溫度大于38℃時(shí)觸發(fā)規(guī)則,并篩選出設(shè)備名稱(chēng)、溫度和位置信息,SQL語(yǔ)句如下:

    SELECT temperature as t, deviceName() as deviceName, location 
    FROM "/a1hRrzD****/+/user/update" 
    WHERE temperature > 38
  • 處理基礎(chǔ)通信Topic、物模型通信Topic數(shù)據(jù)的SQL示例。基礎(chǔ)通信Topic、物模型通信Topic中的數(shù)據(jù)流轉(zhuǎn)到規(guī)則引擎后,規(guī)則引擎會(huì)對(duì)數(shù)據(jù)進(jìn)行解析,解析后的數(shù)據(jù)格式,請(qǐng)參見(jiàn)數(shù)據(jù)格式

    某溫濕度傳感器的屬性如下:

    屬性

    溫濕度傳感器上報(bào)的溫度和濕度屬性數(shù)據(jù)經(jīng)規(guī)則引擎解析后,數(shù)據(jù)格式如下:

    {
        "deviceType": "TemperatureHumidityDetector", 
        "iotId": "N5KURkKdibnZvSls****000100", 
        "productKey": "a15NNfl****", 
        "gmtCreate": 1564569974224, 
        "deviceName": "N5KURkKdibnZvSls3Yfx", 
        "items": {
            "CurrentHumidity": {
                "value": 70, 
                "time": 1564569974229
            }, 
            "CurrentTemperature": {
                "value": 23.5, 
                "time": 1564569974229
            }
        }
    }
    重要 SQL查詢(xún)時(shí),必須通過(guò)items.${屬性標(biāo)識(shí)符}.value來(lái)訪問(wèn)指定屬性的數(shù)據(jù)。

    設(shè)置溫度值大于38℃時(shí)觸發(fā)規(guī)則,并篩選出設(shè)備名稱(chēng)、當(dāng)前溫度和當(dāng)前濕度,SQL語(yǔ)句如下:

    編寫(xiě)SQL
    SELECT deviceName() as deviceName, items.CurrentHumidity.value as Humidity, items.CurrentTemperature.value as Temperature 
    FROM "/sysa15NNfl****/N5KUR***/thing/event/property/post" 
    WHERE items.CurrentTemperature.value > 38

    如果是自定義模塊(testFB)下屬性,屬性標(biāo)識(shí)符格式為${模塊標(biāo)識(shí)符}:${屬性標(biāo)識(shí)符},訪問(wèn)指定屬性數(shù)據(jù)時(shí),必須使用英文雙引號(hào)(“”),SQL語(yǔ)句如下:

    SELECT deviceName() as deviceName, "items.testFB:CurrentHumidity.value" as Humidity, "items.testFB:CurrentTemperature.value" as Temperature 
    FROM "/sysa15NNfl****/N5KUR***/thing/event/property/post" 
    WHERE "items.testFB:CurrentTemperature.value" > 38

SELECT

  • JSON數(shù)據(jù)格式

    SELECT語(yǔ)句中的字段,可以使用上報(bào)消息的payload解析結(jié)果,即JSON中的鍵值,也可以使用SQL內(nèi)置的函數(shù),如deviceName()。規(guī)則引擎內(nèi)置的SQL函數(shù),請(qǐng)參見(jiàn)函數(shù)列表

    支持*和函數(shù)的組合。不支持子SQL查詢(xún)。

    上報(bào)的JSON數(shù)據(jù)格式,可以是數(shù)組或者嵌套的JSON。SQL語(yǔ)句支持使用JSONPath獲取其中的屬性值,如對(duì)于{a:{key1:v1, key2:v2}},可以通過(guò)a.key2獲取到值v2。使用變量時(shí),需要注意單雙引號(hào)區(qū)別:?jiǎn)我?hào)表示常量,雙引號(hào)或不加引號(hào)表示變量。如使用單引號(hào)'a.key2',值為a.key2

    本文SQL示例中:

    • 處理自定義Topic數(shù)據(jù)SQL的SELECT語(yǔ)句SELECT temperature as t, deviceName() as deviceName, location中,temperatureloaction來(lái)自于上報(bào)數(shù)據(jù)中的字段,deviceName()則使用了內(nèi)置的SQL函數(shù)。
    • 處理上報(bào)屬性Topic數(shù)據(jù)SQL的SELECT語(yǔ)句SELECT deviceName() as deviceName, items.CurrentHumidity.value as Humidity, items.CurrentTemperature.value as Temperature中,items.CurrentHumidity.valueitems.CurrentTemperature.value來(lái)自于上報(bào)的默認(rèn)模塊屬性數(shù)據(jù)中的字段,deviceName()則使用了內(nèi)置的SQL函數(shù)。
      說(shuō)明 items.testFB:CurrentHumidity.valueitems.testFB:CurrentTemperature.value來(lái)自于上報(bào)的自定義模塊屬性數(shù)據(jù)中的字段。
  • 二進(jìn)制數(shù)據(jù)格式
    • 可填*直接透?jìng)鲾?shù)據(jù)。*后不能再使用函數(shù)。
    • 可使用內(nèi)置函數(shù),如to_base64(*)函數(shù),將原始payload二進(jìn)制數(shù)據(jù)轉(zhuǎn)成base64的String提取出來(lái);deviceName()函數(shù),將設(shè)備名稱(chēng)信息提取出來(lái)。
說(shuō)明 SELECT語(yǔ)句中最多可包含50個(gè)字段。

FROM

FROM可以填寫(xiě)為T(mén)opic,用于匹配需要處理的設(shè)備消息來(lái)源Topic。Topic中的設(shè)備名(deviceName)類(lèi)目可以填寫(xiě)為通配符加號(hào)(+),代表當(dāng)前層級(jí)所有類(lèi)目,即產(chǎn)品下的所有設(shè)備;指定為自定義Topic時(shí),還可以使用通配符井號(hào)(#),代表Topic中當(dāng)前層級(jí)及之后的所有類(lèi)目。通配符說(shuō)明,請(qǐng)參見(jiàn)自定義Topic

當(dāng)來(lái)自指定Topic的消息到達(dá)時(shí),消息的payload數(shù)據(jù)以JSON格式解析,并根據(jù)SQL語(yǔ)句進(jìn)行處理。如果消息格式不合法,將忽略此條消息。您可以使用topic()函數(shù)引用具體的Topic值。

以上SQL示例中:

  • FROM "/a1hRrzD****/+/user/update"語(yǔ)句表示該SQL僅處理自定義Topic:/a1hRrzD****/+/user/update的消息。
  • FROM "/sys/a15NNfl****/N5KURkKdibnZvSls3Yfx/thing/event/property/post"語(yǔ)句表示該SQL僅處理設(shè)備N(xiāo)5KURkKdibnZvSls3Yfx上報(bào)屬性的Topic中的消息。

WHERE

  • JSON數(shù)據(jù)格式

    規(guī)則觸發(fā)條件,條件表達(dá)式。不支持子SQL查詢(xún)。WHERE中可以使用的字段和SELECT語(yǔ)句一致,當(dāng)接收到對(duì)應(yīng)Topic的消息時(shí),WHERE語(yǔ)句的結(jié)果會(huì)作為是否觸發(fā)規(guī)則的判斷條件。具體條件表達(dá)式,請(qǐng)參見(jiàn)以下章節(jié):條件表達(dá)式支持列表。

    上文兩個(gè)示例中,條件語(yǔ)句WHERE temperature > 38表示溫度大于38℃時(shí),才會(huì)觸發(fā)該規(guī)則。

  • 二進(jìn)制數(shù)據(jù)格式

    目前二進(jìn)制格式WHERE語(yǔ)句中,僅支持內(nèi)置函數(shù)及條件表達(dá)式,無(wú)法使用payload中的字段。

SQL結(jié)果

SQL語(yǔ)句執(zhí)行完成后,會(huì)得到對(duì)應(yīng)的SQL結(jié)果,用于下一步轉(zhuǎn)發(fā)處理。如果payload數(shù)據(jù)解析過(guò)程中出錯(cuò),會(huì)導(dǎo)致規(guī)則運(yùn)行失敗。

如果要將數(shù)據(jù)流轉(zhuǎn)到表格存儲(chǔ)中,設(shè)置轉(zhuǎn)發(fā)數(shù)據(jù)目的地時(shí),需要使用變量格式${表達(dá)式} 引用對(duì)應(yīng)的值。

如果以上兩個(gè)示例SQL對(duì)應(yīng)的規(guī)則需將數(shù)據(jù)流轉(zhuǎn)到表格存儲(chǔ)的數(shù)據(jù)表中,主鍵對(duì)應(yīng)的值可分別配置為:

  • ${t}${deviceName}${loaction}
  • ${deviceName}${Humidity}${Temperature}

數(shù)組使用說(shuō)明

數(shù)組表達(dá)式需要使用雙引號(hào),用$.表示取jsonObject,$.可以省略,.表示取jsonArray。

例如設(shè)備消息為:{"a":[{"v":0},{"v":1},{"v":2}]},不同表達(dá)式結(jié)果如下:
  • "a[0]"結(jié)果為{"v":0}
  • "$.a[0]"結(jié)果為{"v":0}
  • ".a[0]" 結(jié)果為[{"v":0}]
  • "a[1].v"結(jié)果為1
  • "$.a[1].v"結(jié)果為1
  • ".a[1].v"結(jié)果為[1]

條件表達(dá)式支持列表

操作符描述舉例
=相等color = 'red'
<>不等于color <> 'red'
AND邏輯與color = 'red' AND siren = 'on'
OR邏輯或color = 'red' OR siren = 'on'
+算術(shù)加法4 + 5
-算術(shù)減5 - 4
/20 / 4
*5 * 4
%取余數(shù)20 % 6
<小于5 < 6
<=小于或等于5 <= 6
>大于6 > 5
>=大于或等于6 >= 5
函數(shù)調(diào)用支持函數(shù),更多信息,請(qǐng)參見(jiàn)函數(shù)列表deviceId()
JSON屬性表達(dá)式可以從消息payload以JSON表達(dá)式提取屬性。state.desired.color,a.b.c[0].d
CASE … WHEN … THEN … ELSE …ENDCase表達(dá)式(不支持嵌套)。CASE col WHEN 1 THEN 'Y' WHEN 0 THEN 'N' ELSE '' END as flag
IN僅支持枚舉,不支持子查詢(xún)。例如:where a in(1,2,3)。不支持以下形式:where a in(select xxx)。
like匹配某個(gè)字符,僅支持%通配符,代表匹配任意字符串。
  • like:查詢(xún)包含某個(gè)字符的數(shù)據(jù)。
  • not like:查詢(xún)不包含某個(gè)字符的數(shù)據(jù)。
where c1 like '%abc'
not likewhere c1 not like '%def%'

調(diào)試SQL

若創(chuàng)建數(shù)據(jù)流轉(zhuǎn)規(guī)則時(shí),數(shù)據(jù)格式選擇了JSON,可在物聯(lián)網(wǎng)平臺(tái)進(jìn)行SQL在線調(diào)試。調(diào)試方法如下。

  1. 編寫(xiě)SQL后,單擊SQL調(diào)試
  2. SQL調(diào)試對(duì)話(huà)框的調(diào)試參數(shù)頁(yè)簽下,輸入用于調(diào)試數(shù)據(jù),然后單擊調(diào)試

    請(qǐng)根據(jù)Topic上報(bào)的數(shù)據(jù)格式,輸入調(diào)試用的payload數(shù)據(jù)。數(shù)據(jù)格式說(shuō)明:

    • 若Topic為自定義Topic,輸入的payload數(shù)據(jù)格式需與Topic上報(bào)的數(shù)據(jù)格式一致。
    • 若Topic為基礎(chǔ)通信Topic或物模型通信Topic,請(qǐng)參見(jiàn)數(shù)據(jù)格式
    SQLtest1
  3. 單擊調(diào)試結(jié)果,查看結(jié)果。SQLtestResult