SQL 语句示例:

  • 从 topic 为 “t/a” 的消息中提取所有字段:

    1. SELECT * FROM "message.publish" WHERE topic = 't/a'
  • 从 topic 能够匹配到 ‘t/#’ 的消息中提取所有字段。注意这里使用了 ‘=~’ 操作符进行带通配符的 topic 匹配:

    1. SELECT * FROM "message.publish" WHERE topic =~ 't/#'
  • 从 topic 能够匹配到 ‘t/#’ 的消息中提取 qos,username 和 client_id 字段:

    1. SELECT qos, username, client_id FROM "message.publish" WHERE topic =~ 't/#'
  • 从任意 topic 的消息中提取 username 字段,并且筛选条件为 username = ‘Steven’:

    1. SELECT username FROM "message.publish" WHERE username='Steven'
  • 从任意 topic 的 JSON 消息体(payload) 中提取 x 字段,并创建别名 x 以便在 WHERE 子句中使用。WHERE 子句限定条件为 x = 1。注意如果 payload 不是合法的 JSON 格式,JSON 解码会失败,导致整个语句匹配失败。下面这个 SQL 语句可以匹配到消息体 {“x”: 1}, 但不能匹配到消息体 {“x”: 2}:

    1. SELECT payload as p FROM "message.publish" WHERE p.x = 1
  • 类似于上面的 SQL 语句,但嵌套地提取消息体中的数据,下面的 SQL 语句可以匹配到 JSON 消息体 {“x”: {“y”: 1}}:

    1. SELECT payload as a FROM "message.publish" WHERE a.x.y = 1
  • 在 client_id = ‘c1’ 尝试连接时,提取其来源 IP 地址和端口号:

    1. SELECT peername as ip_port FROM "client.connected" WHERE client_id = 'c1'
  • 筛选所有订阅 ‘t/#’ 主题且订阅级别为 QoS1 的 client_id。注意这里用的是严格相等操作符 ‘=’ ,所以不会匹配主题为 ‘t’ 或 ‘t/+/a’ 的订阅请求:

    1. SELECT client_id FROM "client.subscribe" WHERE topic = 't/#' and qos = 1
  • 事实上,上例中的 topic 和 qos 字段,是当订阅请求里只包含了一对 (Topic, QoS) 时,为使用方便而设置的别名。但如果订阅请求中 Topic Filters 包含了多个 (Topic, QoS) 组合对,那么必须显式使用 contains_topic() 或 contains_topic_match() 函数来检查 Topic Filters 是否包含指定的 (Topic, QoS):

    1. SELECT client_id FROM "client.subscribe" WHERE contains_topic(topic_filters, 't/#')
    2. SELECT client_id FROM "client.subscribe" WHERE contains_topic(topic_filters, 't/#', 1)

Important

FROM 子句后面的触发事件需要用双引号 "" 引起来。 WHERE 子句后面接筛选条件,如果使用到字符串需要用单引号 '' 引起来。 使用 "." 符号对 payload 进行嵌套选择时, 如果 payload 不是 JSON 格式的, 则 SQL 匹配失败。