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

规则引擎支持的函数如下表。

函数名 函数说明
abs(number) 返回绝对值。
asin(number) 返回number值的反正弦。
attribute(key) 返回key所对应的设备标签。如果设备没有该key对应的标签,则返回值为空。使用SQL调试时,因为没有真实设备及对应的标签,返回值为空。
concat(string1, string2) 用于连接字符串。返回连接后的字符串。

示例:concat(field,'a')

cos(number) 返回number值的余弦。
cosh(number) 返回number值的双曲余弦(hyperbolic cosine)。
crypto(field,String)

对field的值进行加密。

第二个参数String为算法字符串。可选:MD2、MD5、SHA1、SHA-256、SHA-384、SHA-512。

deviceName() 返回当前设备名称。使用SQL调试时,因为没有真实设备,返回值为空。
endswith(input, suffix) 判断input的值是否以suffix结尾。
exp(number) 返回指定数字的指定次幂。
floor(number) 返回一个最接近它的整数,它的值小于或等于这个浮点数。
log(n, m)

返回自然对数。

如果不传m值,则返回log(n)

lower(string) 返回小写字符串。
mod(n, m) n%m余数。
nanvl(value, default)

返回属性值。

若属性值为null,则返回default。

newuuid() 返回一个随机UUID字符串。
payload(textEncoding)

返回设备发布消息的payload转义字符串。

字符编码默认UTF-8,即payload()默认等价于payload(‘utf-8’)

power(n,m) 返回n的m次幂。
rand() 返回[0~1)之间的一个随机数。
replace(source, substring, replacement)

对某个目标列值进行替换,即用replacement替换resouce中的substring。

示例:replace(field,’a’,’1’)

sin(n) 返回n值的正弦。
sinh(n) 返回n值的双曲正弦(hyperbolic sine)。
tan(n) 返回n值的正切。
tanh(n) 返回n值的双曲正切(hyperbolic tangent)。
timestamp(format)

返回当前系统时间,格式化后返回当前地域的时间。

format为可选。如果为空,则返回当前系统时间戳毫秒值,例如,使用timestamp(),返回的时间戳为1543373798943;如果指定format,则根据指定格式,返回当前系统时间,如timestamp('yyyy-MM-dd\'T\'HH:mm:ss\'Z\''),返回的时间戳为2018-11-28T10:56:38Z

timestamp_utc(format) 返回当前系统时间,格式化后返回UTC时间。

format为可选。如果format为空,则返回当前系统时间戳毫秒值,例如,使用timestamp_utc(),返回的时间戳为1543373798943;使用timestamp_utc('yyyy-MM-dd\'T\'HH:mm:ss\'Z\''),返回的时间戳为2018-11-28T02:56:38Z

topic(number)

返回Topic分段信息。

如,有一个Topic: /alDbcLe****/TestDevice/user/set。使用函数topic(),则返回整个Topic /alDbcLe****/TestDevice/user/set; 使用topic(1),则返回Topic的第一级类目alDbcLe****; 使用topic(2),则返回TestDevice

upper(string) 将字符串中的小写字母转为大写字母。

示例:函数upper(alibaba)的返回结果是ALIBABA

to_base64(*) 当原始Payload数据为二进制数据时,可使用该函数,将所有二进制数据转换成base64String。
messageId() 返回物联网平台生成的消息ID。
substring(target, start, end) 返回从start(包括)到end(不包括)的字符串。
  • target:要操作的字符串。 必填。
  • start:起始下标。必填。
  • end:结束下标。非必填。
说明
  • 目前,仅支持String和Int类型数据。Int类型数据会被转换成String类型后再处理。
  • 常量字符串,请使用单引号。双引号中的数据,将视为Int类型数据进行解析。
  • 如果传入的参数错误,例如参数类型不支持,会导致SQL解析失败,而放弃执行规则。

字符串截取示例:

  • substring('012345', 0) = "012345"
  • substring('012345', 2) = "2345"
  • substring('012345', 2.745) = "2345"
  • substring(123, 2) = "3"
  • substring('012345', -1) = "012345"
  • substring(true, 1.2) error
  • substring('012345', 1, 3) = "12"
  • substring('012345', -50, 50) = "012345"
  • substring('012345', 3, 1) = ""

使用示例

您可以在数据流转SQL语句的SELECT字段和WHERE条件字段中,使用函数获取数据或者对数据做处理。

例如,某温度感应器产品有一个温度属性(Temperature)。设备上报的温度属性数据经物模型转化后的数据格式如下。

{
    "deviceType": "Custom",
    "iotId": "H5KURkKdibnZvSls****000100",
    "productKey": "a1HHrkm****",
    "gmtCreate": 1564569974224,
    "deviceName": "TestDevice1",
    "items": {
        "Temperature": {
            "value": 23.5,
            "time": 1564569974229
        }
    }
}

该温度感应器产品下有多个设备,但只有当设备TestDevice1、TestDevice2或TestDevice3上报的温度大于38时,需将温度属性数据流转到函数计算中进行计算处理。设置筛选设备上报数据的规则SQL如下图。

SQL语句:

SELECT deviceName() as deviceName,items.Temperature.value as Temperature FROM "/sys/a1HHrkmIE8h/+/thing/event/property/post" WHERE Temperature>38 and (topic(3) = 'TestDevice1' or topic(3) = 'TestDevice2' or topic(3) = 'TestDevice3')

以上示例中,使用了以下两个函数。

  • deviceName():在SELECT字段使用该函数,表示从数据中筛选出设备名称。
  • topic(number):在条件字段使用该函数,并指定为(topic(3) = 'TestDevice1' or topic(3) = 'TestDevice2' or topic(3) = 'TestDevice3')。其中,topic(3)表示Topic:/sys/a1HHrkmIE8h/+/thing/event/property/post的第三级类目,即设备名称类目。通配符加号(+)表示该产品下所有的设备名称。本示例中,仅当设备名称类目的值为TestDevice1、TestDevice2或TestDevice2中的其中一个时,才会进行数据流转。

规则SQL中,SELECT字段和WHERE条件字段的具体编写方法,和规则引擎支持的条件表达式列表,请参见SQL表达式