本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
JSON 擴充
您可以使用下列擴充功能來ANSISQL語法,以方便使用巢狀JSON物件。
"." 運算子
此運算子會存取內嵌JSON物件中的成員,以及與 ANSI SQL 和 相同的函數 JavaScript。例如:
SELECT foo.bar AS bar.baz FROM 'topic/subtopic'
從傳送至 topic/subtopic
主題的下列訊息承載中選取 foo
物件中 bar
屬性的值。
{ "foo": { "bar": "RED", "bar1": "GREEN", "bar2": "BLUE" } }
如果JSON屬性名稱包含連字號字元或數字字元,則 'dot' 表示法將無法運作。您必須改用 get 函數 來擷取屬性的值。
在此範例中,下列訊息會傳送至 iot/rules
主題。
{ "mydata": { "item2": { "0": { "my-key": "myValue" } } } }
正常情況下,將識別 my-key
的值,如在此查詢中一般。
SELECT * from iot/rules WHERE mydata.item2.0.my-key= "myValue"
不過,由於屬性名稱 my-key
包含連字號,且 item2
包含數字字元,所以 get 函數必須如下列查詢所示一般使用。
SELECT * from 'iot/rules' WHERE get(get(get(mydata,"item2"),"0"),"my-key") = "myValue"
*
運算子
此函數與 ANSI 中的*
萬用字元相同SQL。它僅用於 SELECT子句,並建立新的JSON物件,其中包含訊息資料。如果訊息承載不是 JSON 格式, 會以原始位元組的形式*
傳回整個訊息承載。例如:
SELECT * FROM 'topic/subtopic'
將函數套用在屬性值上
以下是裝置可能發佈的範例JSON承載:
{ "deviceid" : "iot123", "temp" : 54.98, "humidity" : 32.43, "coords" : { "latitude" : 47.615694, "longitude" : -122.3359976 } }
下列範例會將函數套用至JSON承載中的屬性值:
SELECT temp, md5(deviceid) AS hashed_id FROM topic/#
此查詢的結果是下列JSON物件:
{ "temp": 54.98, "hashed_id": "e37f81fb397e595c4aeb5645b8cbbbd1" }