设备接入 IoTDA设备接入 IoTDA

更新时间:2021/07/08 GMT+08:00
分享

SQL语句

创建数据流转规则时,需要编写SQL来解析和处理设备上报的JSON数据,JSON数据具体格式参考流转数据。二进制格式的数据不做解析,直接透传。本文主要介绍如何编写数据流转规则的SQL表达式。

SQL语句

SQL语句由SELECT子句和WHERE子句组成,每个子句不能大于500个字符,暂不支持中文等其他字符集。SELECT子句和WHERE子句里的内容大小写敏感,SELECT和WHERE,AS等关键字大小写不敏感。

以设备消息上报为SQL源数据示例:

{
  "resource" : "device.message",
  "event" : "report",
  "event_time" : "20151212T121212Z",
  "notify_data" : {
    "header" : {
      "device_id" : "d4922d8a-6c8e-4396-852c-164aefa6638f",
      "product_id" : "ABC123456789",
      "app_id" : "d4922d8a-6c8e-4396-852c-164aefa6638f",
      "gateway_id" : "d4922d8a-6c8e-4396-852c-164aefa6638f",
      "node_id" : "ABC123456789",
      "tags" : [ {
        "tag_value" : "testTagValue",
        "tag_key" : "testTagName"
      } ]
    },
    "body" : {
      "topic" : "topic",
      "content" : {
          "temperature" : 40,
          "humidty" : 24
      }
    }
  }
}

在源数据中,body中的content是设备消息上报的数据,设置当设备上报数据中temperature大于38时触发条件,并筛选出device_id、content,不需要任何其他字段时,SQL语句示例如下:

SELECT notify_data.header.device_id AS device_id, notify_data.body.content WHERE notify_data.body.content.temperature > 38

当设备上报消息中temperature大于38度时,会触发转发,转发后的数据格式如下:

{
    "device_id": "d4922d8a-6c8e-4396-852c-164aefa6638f",
    "notify_data.body.content" : {
          "temperature" : 40,
          "humidty" : 24
     }
}

SELECT子句

SELECT子句由SELECT后跟多个SELECT子表达式组成,子表达式可以为*,JSON变量,字符串常量或整数常量。JSON变量后跟一个AS关键字和AS变量,长度不超过32个字符。如果使用常量,则必须使用AS指定名称。

  • JSON变量

    JSON变量支持大小写字母,数字,下划线和中划线,为了和减号的意思区分,当使用中划线的时候,请将JSON变量用双引号括起来,如:"msg-type"。

    Json变量抽取嵌套结构体的数据

    {
      "a":"b",
      "c": {
        "d" : "e"
      }
    }

    c.d 即可抽取出字符串e,可以多层嵌套。

  • AS变量

    AS变量由大小写字母组成,大小写敏感。目前支持[a-zA-Z_-]*的模式,如果使用中划线,需要使用双引号括起来。

  • 常数整数

    正如标准的SQL一样,SELECT上面支持常数整数,常数后必须跟AS子句,如

    SELECT 5 AS number
  • 常数字符串

    正如标准的SQL一样,SELECT上面支持常数字符串,目前支持[a-zA-Z_-]*的模式,需要使用单引号括起来,常数后必须跟AS子句,如

    SELECT 'constant_info' AS str

WHERE

在WHERE子句中,您可以用JSON变量进行布尔运算,进行一些非空判断,然后使用AND, OR关键字把结果组合起来。

  • 为空判断 IS NULL, IS NOT NULL

    为空判断可以用在WHERE子句中,如果JSON变量抽取不到数据,或者抽取到的数组为空,那么IS NULL成立,反之IS NOT NULL成立。

    WHERE data IS NULL
  • 大于小于运算符 > <

    大于小于运算符可以用于WHERE子句中,当且仅当JSON变量的值为常量整数时,可以进行两个JSON变量的比较或者JSON变量和常量的比较。大于小于运算符也可以用于常量和常量的比较。也可以通过AND或者OR来连接起来运算

    比如

    WHERE data.number > 5 可以抽取出json表达式大于5的信息
    WHERE data.tag < 4 可以抽取出json表达式中小于4的信息
    WHERE data.number > 5 AND data.tag < 4 可以抽取出json表达式data.number大于5的信息并且json表达式data.tag中小于4的信息
  • =

    =运算符可以用于WHERE子句中,用于JSON变量和JSON变量的比较、JSON变量整数和整数常量的比较、JSON变量字符串和字符串常量的比较。如果两个JSON变量IS NULL成立,那么=比较结果为false。也可以通过AND或者OR来连接起来运算

    WHERE data.number = 5 可以抽取出json表达式大于5的信息
    WHERE data.tag = 4 可以抽取出json表达式中等于4的信息
    WHERE data.number = 5 OR data.tag = 4 可以抽取出json表达式data.number等于5的信息或者json表达式data.tag中等于4的信息

调试SQL语句

物联网平台提供SQL在线调试功能。调试方法如下。

  1. 编写SQL后,单击“调试语句”

  2. 在SQL调试对话框的调试参数页签下,输入用于调试数据,然后单击“启动调试”

函数列表

规则引擎提供多种函数,您可以在编写SQL时使用这些函数,实现多样化数据处理。

函数名称

携带参数

用途

返回值类型

限制

GET_TAG

String tagKey

获取tag对应的value

字符串

-

CONTAINS_TAG

String tagKey

判断是否包含该tag

布尔值

-

GET_SERVICE

String serviceId

获取指定serviceId的service如果您在一个消息体里有多个serviceId相同的service,结果目前不保证。

Json结构体格式

只能在属性上报时使用

GET_SERVICES

String serviceId

获取指定serviceId的service如果您在一个消息体里有多个serviceId相同的service,结果目前不保证。

JSON数组格式

只能在属性上报时使用

CONTAINS_SERVICES

String serviceId

获取指定serviceId的service,将结果汇合为一个数组

布尔值

只能在属性上报时使用

GET_SERVICE_PROPERTIES

String serviceId

获取指定serviceId的service中的properties字段

Json结构体格式

只能在属性上报时使用

GET_SERVICE_PROPERTY

String serviceId, String propertyKey

获取指定serviceId的service中的properties中propertyKey的属性值

字符串格式

限制只能在属性上报时使用

分享:

    相关文档

    相关产品