SQL语句

OneNET将系统的基础消息格式设计为json格式,其数据可以映射为虚拟的表,数据中的Key对应表的列,Value对应列值,规则引擎支持SQL语句对该数据进行处理,如下图所示:

示例

消息源选择为设备数据点消息,基础消息格式示例如下:

{
    "sysProperty": {
        "messageType": "deviceDatapoint",
        "productId": "90273"
    },
    "appProperty":{
        "deviceId": "102839",
        "dataTimestamp": 15980987429000,
        "datastream":"weather"
    },
    "body":{
        "temperature": 30,
        "humidity": "47%"
    }
}

SQL示例:

SELECT appProperty.deviceId as did, body as weather FROM /deviceDatapoint/ds WHERE body.temperature > 10

该SQL语句表示:

筛选设备上传数据点的消息,当body的value大于10的时候,提取appProperty.deviceId属性,并重命名为 did;提取body属性,重命名为weather ,消息重组后进行转发

经过该SQL处理的消息输出如下消息

{
    "did": "102839",
    "weather": {
        "temperature": 30,
        "humidity": "47%"
    }
}

SELECT

  • 默认为 *,即不做任何提取与重组操作
  • 支持 as,可对提取出的属性进行重命名,示例如下:
    SELECT body as temperature
    
  • 支持使用 json path 获取嵌套 json 中的属性值,示例如下:
    SELECT appProperty.deviceId as did
    
  • 支持通过逗号(,) 进行多个属性的提取与重命名,示例如下:
    SELECT appProperty.deviceId as did, appProperty.dataTimestamp as t
    
  • 不支持子SQL查询
  • SELECT语句中的最多支持10个查询字段
  • 支持常量数据插入,向原JSON数据中插入值
    • 支持插入数值型数据与字符串型数据
    • 支持插入 内置函数 所取得值,均为字符串型
    • 支持JSON嵌套插入,最多支持5层嵌套插入,如 SELECT 1 as a.b.c.d.e
    • 插入操作时与原数据中的key同级同名时,覆盖原有内容

SELECT使用示例列表如下:

原JSONSQL语句结果说明
{}SELECT 1 as a{"a":1}-
{}SELECT 'red' as a{"a":"red"}-
{}SELECT '' as a{"a":""}插入空字符串
{}SELECT 1 as a.b{"a":{"b":1}}嵌套插入
{"b":3}SELECT 1 as a{"a":1}-
{"b":3}SELECT 'red' as a{"a":"red"}-
{"b":3}SELECT '' as a{"a":""}插入空字符串
{"b":3}SELECT 1 as a.b {"a":{"b":1}嵌套插入
{"b":3}SELECT *,1 as a{"b":3,"a":1}-
{"b":3}SELECT *,'red' as a{"b":3,"a":"red"}-
{"b":3}SELECT *,'' as a{"b":3,"a":""}插入空字符串
{"b":3}SELECT *,1 as a.b {"b":3,"a":{"b":1}嵌套插入
{"c":3}SELECT *,1 as c{"c":1}对同级同名key进行插入,执行覆盖原有内容

WHERE

WHERE语句用于定义规则触发条件

  • 支持使用 json path 获取嵌套 json 中的属性值,同SELECT,示例如下:
    SELECT * WHERE body.temperature > 10
    
  • 支持对数值类型进行大于、小于、等于判断,示例如下:
    SELECT * WHERE body.temperature = 10
    
  • 支持对字符类型进行匹配判断,示例如下:
    SELECT * WHERE body.humidity = '47%'
    
  • 支持多个表达式的 "与" "或"条件运算,示例如下:
    SELECT * WHERE body.temperature > 10 AND body.temperature < 30
    
    表达式支持详情见下表

条件表达式支持列表

操作符说明举例
=相等temperature=20
!=不等于temperature!=20
AND逻辑与temperature=20 AND country='CN'
OR逻辑或temperature=20 OR country='CN'
( )括号中表达式优先计算temperature=20 AND (country='CN' OR online = true)
+算术加法4+5
-算术减法5-4
/算术除法10/5
*算术乘法2*5
%取余20%7
<小于5<6
<=小于等于5<=6
>大于5>4
>=大于等于5>=4

个搜索结果,搜索内容 “

    0 个搜索结果,搜索内容 “