内置 SQL 函数

数学函数

函数名函数作用参数返回值
abs绝对值1. 被操作数绝对值
cos余弦1. 被操作数余弦值
cosh双曲余弦1. 被操作数双曲余弦值
acos反余弦1. 被操作数反余弦值
acosh反双曲余弦1. 被操作数反双曲余弦值
sin正弦1. 被操作数正弦值
sinh双曲正弦1. 被操作数双曲正弦值
asin反正弦1. 被操作数
asinh反双曲正弦1. 被操作数反双曲正弦值
tan正切1. 被操作数正切值
tanh双曲正切1. 被操作数双曲正切值
atan反正切1. 被操作数反正切值
atanh反双曲正切1. 被操作数反双曲正切值
ceil上取整1. 被操作数整数值
floor下取整1. 被操作数整数值
round四舍五入1. 被操作数整数值
exp幂运算1. 被操作数e 的 x 次幂
power指数运算1. 左操作数 x
2. 右操作数 y
x 的 y 次方
sqrt平方根运算1. 被操作数平方根
fmod负点数取模函数1. 左操作数
2. 右操作数
log以 e 为底对数1. 被操作数
log10以 10 为底对数1. 被操作数
log2以 2 为底对数1. 被操作数
  1. abs(-12) = 12
  2. cos(1.5) = 0.0707372016677029
  3. cosh(1.5) = 2.352409615243247
  4. acos(0.0707372016677029) = 1.5
  5. acosh(2.352409615243247) = 1.5
  6. sin(0.5) = 0.479425538604203
  7. sinh(0.5) = 0.5210953054937474
  8. asin(0.479425538604203) = 0.5
  9. asinh(0.5210953054937474) = 0.5
  10. tan(1.4) = 5.797883715482887
  11. tanh(1.4) = 0.8853516482022625
  12. atan(5.797883715482887) = 1.4
  13. atanh(0.8853516482022625) = 1.4000000000000001
  14. ceil(1.34) = 2
  15. floor(1.34) = 1
  16. round(1.34) = 1
  17. round(1.54) = 2
  18. exp(10) = 22026.465794806718
  19. power(2, 10) = 1024
  20. sqrt(2) = 1.4142135623730951
  21. fmod(-32, 5) = -2
  22. log10(1000) = 3
  23. log2(1024) = 10

数据类型判断函数

函数名函数作用参数返回值
is_null判断变量是否为空值DataBoolean 类型的数据。如果为空值(undefined) 则返回 true,否则返回 false
is_not_null判断变量是否为非空值DataBoolean 类型的数据。如果为空值(undefined) 则返回 false,否则返回 true
is_str判断变量是否为 String 类型DataBoolean 类型的数据。
is_bool判断变量是否为 Boolean 类型DataBoolean 类型的数据。
is_int判断变量是否为 Integer 类型DataBoolean 类型的数据。
is_float判断变量是否为 Float 类型DataBoolean 类型的数据。
is_num判断变量是否为数字类型,包括 Integer 和 Float 类型DataBoolean 类型的数据。
is_map判断变量是否为 Map 类型DataBoolean 类型的数据。
is_array判断变量是否为 Array 类型DataBoolean 类型的数据。
  1. is_null(undefined) = true
  2. is_not_null(1) = true
  3. is_str(1) = false
  4. is_str('val') = true
  5. is_bool(true) = true
  6. is_int(1) = true
  7. is_float(1) = false
  8. is_float(1.234) = true
  9. is_num(2.3) = true
  10. is_num('val') = false

数据类型转换函数

函数名函数作用参数返回值
str将数据转换为 String 类型DataString 类型的数据。无法转换将会导致 SQL 匹配失败
str_utf8将数据转换为 UTF-8 String 类型DataUTF-8 String 类型的数据。无法转换将会导致 SQL 匹配失败
bool将数据转换为 Boolean 类型DataBoolean 类型的数据。无法转换将会导致 SQL 匹配失败
int将数据转换为整数类型Data整数类型的数据。无法转换将会导致 SQL 匹配失败
float将数据转换为浮点型类型Data浮点型类型的数据。无法转换将会导致 SQL 匹配失败
float2str将浮点型数字以指定精度转换为字符串1. 浮点型数字 2. 精度字符串
map将数据转换为 Map 类型DataMap 类型的数据。无法转换将会导致 SQL 匹配失败
  1. str(1234) = '1234'
  2. str_utf8(1234) = '1234'
  3. bool('true') = true
  4. int('1234') = 1234
  5. float('3.14') = 3.14
  6. float2str(20.2, 10) = '20.2'
  7. float2str(20.2, 17) = '20.19999999999999928'

注意浮点型转换为字符串的时候,输出结果会受到精度的影响,详情见:floating-point-guide内置 SQL 函数 - 图1 (opens new window)

字符串函数

函数名函数作用参数返回值
lower转为小写1. 原字符串小写字符串
upper转为大写1. 原字符串大写字符串
trim去掉左右空格1. 原字符串去掉空格后的字符串
ltrim去掉左空格1. 原字符串去掉空格后的字符串
rtrim去掉右空格1. 原字符串去掉空格后的字符串
reverse字符串反转1. 原字符串翻转后的字符串
strlen取字符串长度1. 原字符串整数值,字符长度
substr取字符的子串1. 原字符串
2. 起始位置. 注意: 下标从 0 开始
子串
substr取字符的子串1. 原字符串
2. 起始位置
3. 要取出的子串长度. 注意: 下标从 0 开始
子串
split字符串分割1. 原字符串
2. 分割符子串
分割后的字符串数组
split字符串分割,只查找左边第一个分隔符1. 原字符串
2. 分割符子串
3. ‘leading’
分割后的字符串数组
split字符串分割,只查找右边第一个分隔符1. 原字符串
2. 分割符子串
3. ‘trailing’
分割后的字符串数组
concat字符串拼接1. 左字符串
2. 右符子串
拼接后的字符串
tokens字符串分解(按照指定字符串符分解)1. 输入字符串
2. 分割符或字符串
分解后的字符串数组
tokens字符串分解(按照指定字符串和换行符分解)1. 输入字符串
2. 分割符或字符串
3. ‘nocrlf’
分解后的字符串数组
sprintf字符串格式化,格式字符串的用法详见 https://erlang.org/doc/man/io.html#fwrite-1 里的 Format 部分1. 格式字符串
2,3,4… 参数列表。参数个数不定
分解后的字符串数组
pad字符串补足长度,补空格,从尾部补足1. 原字符串
2. 字符总长度
补足后的字符串
pad字符串补足长度,补空格,从尾部补足1. 原字符串
2. 字符总长度
3. ‘trailing’
补足后的字符串
pad字符串补足长度,补空格,从两边补足1. 原字符串
2. 字符总长度
3. ‘both’
补足后的字符串
pad字符串补足长度,补空格,从头部补足1. 原字符串
2. 字符总长度
3. ‘leading’
补足后的字符串
pad字符串补足长度,补指定字符,从尾部补足1. 原字符串
2. 字符总长度
3. ‘trailing’
4. 指定用于补足的字符
补足后的字符串
pad字符串补足长度,补指定字符,从两边补足1. 原字符串
2. 字符总长度
3. ‘both’
4. 指定用于补足的字符
补足后的字符串
pad字符串补足长度,补指定字符,从头部补足1. 原字符串
2. 字符总长度
3. ‘leading’
4. 指定用于补足的字符
补足后的字符串
replace替换字符串中的某子串,查找所有匹配子串替换1. 原字符串
2. 要被替换的子串
3. 指定用于替换的字符串
替换后的字符串
replace替换字符串中的某子串,查找所有匹配子串替换1. 原字符串
2. 要被替换的子串
3. 指定用于替换的字符串
4. ‘all’
替换后的字符串
replace替换字符串中的某子串,从尾部查找第一个匹配子串替换1. 原字符串
2. 要被替换的子串
3. 指定用于替换的字符串
4. ‘trailing’
替换后的字符串
replace替换字符串中的某子串,从头部查找第一个匹配子串替换1. 原字符串
2. 要被替换的子串
3. 指定用于替换的字符串
4. ‘leading’
替换后的字符串
regex_match判断字符串是否与某正则表达式匹配1. 原字符串
2. 正则表达式
true 或 false
regex_replace替换字符串中匹配到某正则表达式的子串1. 原字符串
2. 正则表达式
3. 指定用于替换的字符串
替换后的字符串
ascii返回字符对应的 ASCII 码1. 字符整数值,字符对应的 ASCII 码
find查找并返回字符串中的某个子串,从头部查找1. 原字符串
2. 要查找的子串
查抄到的子串,如找不到则返回空字符串
find查找并返回字符串中的某个子串,从头部查找1. 原字符串
2. 要查找的子串
3. ‘leading’
查抄到的子串,如找不到则返回空字符串
find查找并返回字符串中的某个子串,从尾部查找1. 原字符串
2. 要查找的子串
3. ‘trailing’
查抄到的子串,如找不到则返回空字符串
  1. lower('AbC') = 'abc'
  2. lower('abc') = 'abc'
  3. upper('AbC') = 'ABC'` `lower('ABC') = 'ABC'
  4. trim(' hello ') = 'hello'
  5. ltrim(' hello ') = 'hello '
  6. rtrim(' hello ') = ' hello'
  7. reverse('hello') = 'olleh'
  8. strlen('hello') = 5
  9. substr('abcdef', 2) = 'cdef'
  10. substr('abcdef', 2, 3) = 'cde'
  11. split('a/b/ c', '/') = ['a', 'b', ' c']
  12. split('a/b/ c', '/', 'leading') = ['a', 'b/ c']
  13. split('a/b/ c', '/', 'trailing') = ['a/b', ' c']
  14. concat('a', '/bc') = 'a/bc'
  15. 'a' + '/bc' = 'a/bc'
  16. tokens(' a/b/ c', '/') = [' a', 'b', ' c']
  17. tokens(' a/b/ c', '/ ') = ['a', 'b', 'c']
  18. tokens(' a/b/ c\n', '/ ') = ['a', 'b', 'c\n']
  19. tokens(' a/b/ c\n', '/ ', 'nocrlf') = ['a', 'b', 'c']
  20. tokens(' a/b/ c\r\n', '/ ', 'nocrlf') = ['a', 'b', 'c']
  21. sprintf('hello, ~s!', 'steve') = 'hello, steve!'
  22. sprintf('count: ~p~n', 100) = 'count: 100\n'
  23. pad('abc', 5) = 'abc '
  24. pad('abc', 5, 'trailing') = 'abc '
  25. pad('abc', 5, 'both') = ' abc '
  26. pad('abc', 5, 'leading') = ' abc'
  27. pad('abc', 5, 'trailing', '*') = 'abc**'
  28. pad('abc', 5, 'trailing', '*#') = 'abc*#*#'
  29. pad('abc', 5, 'both', '*') = '*abc*'
  30. pad('abc', 5, 'both', '*#') = '*#abc*#'
  31. pad('abc', 5, 'leading', '*') = '**abc'
  32. pad('abc', 5, 'leading', '*#') = '*#*#abc'
  33. replace('ababef', 'ab', 'cd') = 'cdcdef'
  34. replace('ababef', 'ab', 'cd', 'all') = 'cdcdef'
  35. replace('ababef', 'ab', 'cd', 'trailing') = 'abcdef'
  36. replace('ababef', 'ab', 'cd', 'leading') = 'cdabef'
  37. regex_match('abc123', '[a-zA-Z1-9]*') = true
  38. regex_replace('ab1cd3ef', '[1-9]', '[&]') = 'ab[1]cd[3]ef'
  39. regex_replace('ccefacef', 'c+', ':') = ':efa:ef'
  40. ascii('a') = 97
  41. find('eeabcabcee', 'abc') = 'abcabcee'
  42. find('eeabcabcee', 'abc', 'leading') = 'abcabcee'
  43. find('eeabcabcee', 'abc', 'trailing') = 'abcee'

Map 函数

函数名函数作用参数返回值
map_get取 Map 中某个 Key 的值,如果没有则返回空值1. Key
2. Map
Map 中某个 Key 的值。支持嵌套的 Key,比如 “a.b.c”
map_get取 Map 中某个 Key 的值,如果没有则返回指定默认值1. Key
2. Map
3. Default Value
Map 中某个 Key 的值。支持嵌套的 Key,比如 “a.b.c”
map_put向 Map 中插入值1. Key
2. Value
3. Map
插入后的 Map。支持嵌套的 Key,比如 “a.b.c”
  1. map_get('a', json_decode( '{ "a" : 1 }' )) = 1
  2. map_get('b', json_decode( '{ "a" : 1 }' ), 2) = 2
  3. map_get('a', map_put('a', 2, json_decode( '{ "a" : 1 }' ))) = 2

数组函数

函数名函数作用参数返回值
nth取第 n 个元素,下标从 1 开始1. 起始位置
2. 原数组
第 n 个元素
length获取数组的长度1. 原数组数组长度
sublist取从第一个元素开始、长度为 len 的子数组。下标从 1 开始1. 长度 len
2. 原数组
子数组
sublist取从第 n 个元素开始、长度为 len 的子数组。下标从 1 开始1. 起始位置 n
2. 长度 len
3. 原数组
子数组
first取第 1 个元素。下标从 1 开始1. 原数组第 1 个元素
last取最后一个元素。1. 原数组最后一个元素
contains判断数据是否在数组里面1. 数据
2. 原数组
Boolean 值
  1. nth(2, [1,2,3,4]) = 2
  2. length([1,2,3,4]) = 4
  3. sublist(3, [1,2,3,4]) = [1,2,3,4]
  4. sublist(1,2,[1,2,3,4]) = [1, 2]
  5. first([1,2,3,4]) = 1
  6. last([1,2,3,4]) = 4
  7. contains(2, [1,2,3,4]) = true

哈希函数

函数名函数功能参数返回值
md5求 MD5 值数据MD5 值
sha求 SHA 值数据SHA 值
sha256求 SHA256 值数据SHA256 值
  1. md5('some val') = '1b68352b3e9c2de52ffd322e30bffcc4'
  2. sha('some val') = 'f85ba28ff5ea84a0cbfa118319acb0c5e58ee2b9'
  3. sha256('some val') = '67f97635d8a0e064f60ba6e8846a0ac0be664f18f0c1dc6445cd3542d2b71993'

压缩解压缩函数

函数名函数功能参数返回值
gzip压缩数据,结果包含 gz 数据头和校验和原始的二进制数据压缩后的二进制数据
gunzip解压缩数据,原始数据中包含 gz 数据头和校验和压缩后的二进制数据原始的二进制数据
zip压缩数据,结果不包含 zlib 数据头和校验和原始的二进制数据压缩后的二进制数据
unzip解压缩数据,原始数据中不包含 zlib 数据头和校验和压缩后的二进制数据原始的二进制数据
zip_compress压缩数据,结果包含 zlib 数据头和校验和原始的二进制数据压缩后的二进制数据
zip_uncompress解压缩数据,原始数据中包含 zlib 数据头和校验和压缩后的二进制数据原始的二进制数据
  1. bin2hexstr(gzip('hello world')) = '1F8B0800000000000003CB48CDC9C95728CF2FCA49010085114A0D0B000000'
  2. gunzip(hexstr2bin('1F8B0800000000000003CB48CDC9C95728CF2FCA49010085114A0D0B000000')) = 'hello world'
  3. bin2hexstr(zip('hello world')) = 'CB48CDC9C95728CF2FCA490100'
  4. unzip(hexstr2bin('CB48CDC9C95728CF2FCA490100')) = 'hello world'
  5. bin2hexstr(zip_compress('hello world')) = '789CCB48CDC9C95728CF2FCA4901001A0B045D'
  6. zip_uncompress(hexstr2bin('789CCB48CDC9C95728CF2FCA4901001A0B045D')) = 'hello world'

比特操作函数

函数名函数功能参数返回值
subbits从二进制数据的起始位置获取指定长度的比特位,然后转换为无符号整型 (大端).1. 二进制数据
2. 要获取的长度(bits)
subbits从二进制数据的指定下标位置获取指定长度的比特位,然后转换为无符号整型 (大端). 下标是从 1 开始的1. 二进制数据
2. 起始位置的下标
3. 要获取的长度(bits)
无符号整数
subbits从二进制数据的指定下标位置获取指定长度的比特位,然后按照给定的参数转换为想要的数据类型. 下标是从 1 开始的.1. 二进制数据
2. 起始位置的下标
3. 要获取的长度(bits)
4. 数据类型,可选值:’integer’、’float’、’bits’
5. 符号类型,只对整型数据有效,可选值:’unsigned’、’signed’,
6. 大端还是小端,只对整型数据有效,可选值:’big’、’little’
获取到的数据
  1. subbits('abc', 8) = 97
  2. subbits('abc', 9, 8) = 98
  3. subbits('abc', 17, 8) = 99
  4. subbits('abc', 9, 16, 'integer', 'signed', 'big') = 25187
  5. subbits('abc', 9, 16, 'integer', 'signed', 'little') = 25442

编解码函数

函数名函数功能参数返回值
base64_encodeBASE64 编码要编码的二进制数据Base64 编码的字符串
base64_decodeBASE64 解码Base64 编码的字符串解码后的二进制数据
json_encodeJSON 编码要转成 JSON 的数据结构JSON 字符串
json_decodeJSON 解码要解码的 JSON 字符串解码后的数据结构
bin2hexstr二进制数据转为 Hex 字符串二进制数据Hex 字符串
hexstr2binHex 字符串转为二进制数据Hex 字符串二进制数据
  1. base64_encode('some val') = 'c29tZSB2YWw='
  2. base64_decode('c29tZSB2YWw=') = 'some val'
  3. json_encode(json_decode( '{ "a" : 1 }' )) = '{"a":1}'
  4. bin2hexstr(hexstr2bin('ABEF123')) = 'ABEF123'

时间与日期函数

函数函数功能参数返回值
now_timestamp返回当前时间的 Unix 秒级时间戳-Unix 时间戳
now_timestamp指定时间单位,返回当前时间的 Unix 时间戳1. 时间单位Unix 时间戳
now_rfc3339生成当前时间的 RFC3339 字符串,秒级-RFC3339 时间字符串
now_rfc3339指定时间单位,生成当前时间的 RFC3339 字符串1. 时间单位RFC3339 时间字符串
unix_ts_to_rfc3339将秒级 Unix 时间戳转换为 RFC3339 时间字符串1. Unix 时间戳(秒)RFC3339 时间字符串
unix_ts_to_rfc3339指定时间单位,将 Unix 时间戳转换为 RFC3339 时间字符串1. Unix 时间戳
2. 时间单位
RFC3339 时间字符串
rfc3339_to_unix_ts将秒级 RFC3339 时间字符串转换为 Unix 时间戳1. RFC3339 时间字符串Unix 时间戳
rfc3339_to_unix_ts指定时间单位,将 RFC3339 时间字符串转换为 Unix 时间戳1. RFC3339 时间字符串
2. 时间单位
Unix 时间戳
format_date将时间戳转换为格式化时间1. 时间戳精度(参考时间戳精度定义)
2. 时间偏移量(参考时间偏移量定义)
3. 日期格式(参考时间字符串编解码格式)
4. 时间戳(可选参数,默认为当前时间)
格式化时间字符串
date_to_unix_ts将格式化时间转换为时间戳1. 时间戳精度(参考时间戳精度定义)
2. 时间偏移量(可选,未填写时,使用格式化时间字符串中的时间偏移量,参考时间偏移量定义)
3. 日期格式(参考时间字符串编解码格式)
4. 格式化时间字符串
Unix 时间戳
timezone_to_offset_seconds时区偏移量字符串转换为表示秒数的整数该函数接受一个时区偏移字符串作为参数。有效的格式包括 “+hh:mm”、”+hh:mm:ss”、”Z” 表示世界标准时间 (UTC),或者 “local” 表示系统的当前时区。例如,”+02:00”、”+00:00:42”、”Z” 和 “local”。表示秒数的整数

时间戳精度

时间戳精度名称精度示例
second1653557821
millisecond毫秒1653557852982
microsecond微秒1653557892926417
nanosecond纳秒1653557916474793000

时间字符串编解码格式

占位符含义取值范围
%Y0000 - 9999
%m01 - 12
%d01 - 31
%H00 - 12
%M00 - 59
%S01 - 59
%N纳秒000000000 - 999999999
%3N毫秒000000 - 999999
%6N微秒000 - 000
%z时间偏移量 [+|-]HHMM-1159 至 +1159
%:z时间偏移量 [+|-]HH:MM-11:59 至 +11:59
%::z时间偏移量 [+|-]HH:MM:SS-11:59:59 至 +11:59:59

时间偏移量定义

格式含义示例
zUTC Zulu 时间固定值 +00:00
ZUTC Zulu 时间,与 z 相同固定值 +00:00
local系统时间自动获取,例如
北京时间 +08:00
Zulu 时间 +00:00
瑞典斯德哥尔摩时间 +02:00
洛杉矶时间 -08:00
[+|-]HHMM%z 格式北京时间 +0800
Zulu 时间 +0000
瑞典斯德哥尔摩时间 +0200
洛杉矶时间 -0800
[+|-]HH:MM%:z 格式北京时间 +08:00
Zulu 时间 +00:00
瑞典斯德哥尔摩时间 +02:00
洛杉矶时间 -08:00
[+|-]HH:MM:SS%::z 格式北京时间 +08:00:00
Zulu 时间 +00:00:00
瑞典斯德哥尔摩时间 +02:00:00
洛杉矶时间 -08:00:00
integer()时间偏移量秒数北京时间 28800
Zulu 时间 0
瑞典斯德哥尔摩时间 7200
洛杉矶时间 -28800
  1. now_timestamp() = 1650874276
  2. now_timestamp('millisecond') = 1650874318331
  3. now_rfc3339() = '2022-04-25T16:08:41+08:00'
  4. now_rfc3339('millisecond') = '2022-04-25T16:10:10.652+08:00'
  5. unix_ts_to_rfc3339(1650874276) = '2022-04-25T16:11:16+08:00'
  6. unix_ts_to_rfc3339(1650874318331, 'millisecond') = '2022-04-25T16:11:58.331+08:00'
  7. rfc3339_to_unix_ts('2022-04-25T16:11:16+08:00') = 1650874276
  8. rfc3339_to_unix_ts('2022-04-25T16:11:58.331+08:00', 'millisecond') = 1650874318331
  9. format_date('second', '+0800', '%Y-%m-%d %H:%M:%S%:z', 1653561612) = '2022-05-26 18:40:12+08:00'
  10. format_date('second', 'local', '%Y-%m-%d %H:%M:%S%:z') = "2022-05-26 18:48:01+08:00"
  11. format_date('second', 0, '%Y-%m-%d %H:%M:%S%:z') = '2022-05-26 10:42:41+00:00'
  12. date_to_unix_ts('second', '%Y-%m-%d %H:%M:%S%:z', '2022-05-26 18:40:12+08:00') = 1653561612
  13. date_to_unix_ts('second', 'local', '%Y-%m-%d %H-%M-%S', '2022-05-26 18:40:12') = 1653561612
  14. date_to_unix_ts('second', '%Y-%m-%d %H-%M-%S', '2022-05-26 10:40:12') = 1653561612

用来转换 JSON 数据的 JQ 函数

除了以上内置函数外,EMQX 还集成了用于处理 JSON 数据的 JQ 函数,请参考 JQ 函数