规则中SQL语法
1. SQL 基本语法
SELECT /WHERE /FROM
sql
SELECT 字段名 FROM 事件 WHERE 条件FROM子句用于选择主题或事件来源,消息发布则填写消息的主题,是事件则填写对应的事件主题SELECT*是选择所有字段,也可以在**可选字段**中选择输出结果为所有可用字段sqlSELECT * FROM "$events/message_publish"选择字段输出sqlSELECT clientId as id, payload FROM "$events/message_publish"WHERE对 SELECT 选择出来的某个字段进行**条件过滤*选取clientId=test001的终端发来的消息sqlSELECT * 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。

