JSON 扩展
您可以使用 ANSI SQL 语法的以下扩展,以便于使用嵌套 JSON 对象。
"." 运算符
此运算符可访问与 ANSI SQL 和 JavaScript 相同的嵌入式 JSON 对象和函数的成员。例如:
SELECT foo.bar AS bar.baz FROM 'topic/subtopic'
从以下发送至 topic/subtopic
主题的消息负载中选择 foo
对象中的 bar
属性。
{ "foo": { "bar": "RED", "bar1": "GREEN", "bar2": "BLUE" } }
如果 JSON 属性名称包含连字符或数字字符,则“点”符号将不起作用。相反,您必须使用 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" }