Skip to content

规则中SQL语法 ​

1. SQL 基本语法 ​

SELECT /WHERE /FROM ​

sql
SELECT 字段名 FROM 事件 WHERE 条件
  • FROM 子句用于选择主题或事件来源,消息发布则填写消息的主题,是事件则填写对应的事件主题

  • SELECT * 是选择所有字段,也可以在**可选字段**中选择

    输出结果为所有可用字段

    sql
    SELECT * FROM "$events/message_publish"

    选择字段输出

    sql
    SELECT clientId as id, payload  FROM "$events/message_publish"
  • WHERE 对 SELECT 选择出来的某个字段进行**条件过滤*

    选取 clientId= test001 的终端发来的消息

    sql
    SELECT * FROM "$events/message_publish"  where clientId = 'test001'

运算符号 ​

函数名函数作用返回值
+加法,或字符串拼接加和,或拼接之后的字符串
-减法差值
*乘法乘积
/除法商值
=比较两者是否完全相等。可用于比较变量和主题true/false
=~比较主题(topic)是否能够匹配到主题过滤器(topic filter)。只能用于主题匹配true/false
like跟mysql的like语法模糊查询

比较符号 ​

函数名函数作用返回值
>大于true/false
<小于true/false
<=小于等于true/false
>=大于等于true/false
<>不等于true/false
!=不等于true/false

2. SQL 语句示例 ​

基本语法举例 ​

  • 从 topic 为 "/test01/post" 的消息中提取所有字段:
sql
SELECT * FROM "/test01//post"
  • 从 topic 为 "test01/a" 或 "test01/b" 的消息中提取所有字段:
sql
SELECT * FROM "test01/a","test01/b"
  • 从 topic 能够匹配到 'test01/#' 的消息中提取所有字段。
sql
SELECT * FROM "test01/#"
  • 从 topic 能够匹配到 't/#' 的消息中提取 proto_name、payload和 clientid 字段:
sql
SELECT proto_name, payload, clientId FROM "t/#"
  • 在 clientid = 'c1' 连接成功时,提取其来源 IP 地址和端口号:
sql
SELECT peername as ip_port FROM "$events/client_connected" WHERE clientId = 'fastbee'
  • 筛选所有订阅 'test01/#' 主题且订阅级别为 QoS 1 的 clientid:
sql
SELECT clientid FROM "$events/session_subscribed" WHERE topic = 't/#' and qos = 1
  • 筛选所有订阅主题能匹配到 't/#' 且订阅级别为 QoS 1 的 clientid。注意与上例不同的是,这里用的是主题匹配操作符**'=~'**,所以会匹配订阅 't' 或 't/+/a' 的订阅事件:
sql
SELECT clientid FROM "$events/session_subscribed" WHERE topic =~ 't/#' and qos = 1
  • 筛选所有上报主题 。匹配包含 'test/post' 内容的所有主题,与 '=~' 功能相似,类似于sql的模糊匹配:
sql
SELECT clientid FROM "$events/message_publish" WHERE topic like '%test/post%'

注意事项 ​

  • FROM 子句后面的主题需要用双引号 "",。
  • WHERE 子句后面接筛选条件,如果使用到字符串需要用单引号 '' 引起来。
  • FROM 子句里如有多个主题,需要用逗号 "," 分隔。例如 SELECT * FROM "test/1", "test/2" 。
  • 不要给 payload 创建别名,否则会影响运行性能。即尽量不要这么写:SELECT payload as py。

蜂信物联 | fastbee.cn