# 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. 被操作数
abs(-12) = 12
cos(1.5) = 0.0707372016677029
cosh(1.5) = 2.352409615243247
acos(0.0707372016677029) = 1.5
acosh(2.352409615243247) = 1.5
sin(0.5) = 0.479425538604203
sinh(0.5) = 0.5210953054937474
asin(0.479425538604203) = 0.5
asinh(0.5210953054937474) = 0.5
tan(1.4) = 5.797883715482887
tanh(1.4) = 0.8853516482022625
atan(5.797883715482887) = 1.4
atanh(0.8853516482022625) = 1.4000000000000001
ceil(1.34) = 2
floor(1.34) = 1
round(1.34) = 1
round(1.54) = 2
exp(10) = 22026.465794806718
power(2, 10) = 1024
sqrt(2) = 1.4142135623730951
fmod(-32, 5) = -2
log10(1000) = 3
log2(1024) = 10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 数据类型判断函数

函数名函数作用参数返回值
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 类型的数据。
is_null(undefined) = true
is_not_null(1) = true
is_str(1) = false
is_str('val') = true
is_bool(true) = true
is_int(1) = true
is_float(1) = false
is_float(1.234) = true
is_num(2.3) = true
is_num('val') = false
1
2
3
4
5
6
7
8
9
10

# 数据类型转换函数

函数名函数作用参数返回值
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 匹配失败
str(1234) = '1234'
str_utf8(1234) = '1234'
bool('true') = true
int('1234') = 1234
float('3.14') = 3.14
float2str(20.2, 10) = '20.2'
float2str(20.2, 17) = '20.19999999999999928'
1
2
3
4
5
6
7

注意浮点型转换为字符串的时候,输出结果会受到精度的影响,详情见:floating-point-guide (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'
查抄到的子串,如找不到则返回空字符串
lower('AbC') = 'abc'
lower('abc') = 'abc'

upper('AbC') = 'ABC'` `lower('ABC') = 'ABC'

trim(' hello  ') = 'hello'

ltrim(' hello  ') = 'hello  '

rtrim(' hello  ') = ' hello'

reverse('hello') = 'olleh'

strlen('hello') = 5

substr('abcdef', 2) = 'cdef'
substr('abcdef', 2, 3) = 'cde'

split('a/b/ c', '/') = ['a', 'b', ' c']
split('a/b/ c', '/', 'leading') = ['a', 'b/ c']
split('a/b/ c', '/', 'trailing') = ['a/b', ' c']

concat('a', '/bc') = 'a/bc'
'a' + '/bc' = 'a/bc'

tokens(' a/b/ c', '/') = [' a', 'b', ' c']
tokens(' a/b/ c', '/ ') = ['a', 'b', 'c']
tokens(' a/b/ c\n', '/ ') = ['a', 'b', 'c\n']
tokens(' a/b/ c\n', '/ ', 'nocrlf') = ['a', 'b', 'c']
tokens(' a/b/ c\r\n', '/ ', 'nocrlf') = ['a', 'b', 'c']

sprintf('hello, ~s!', 'steve') = 'hello, steve!'
sprintf('count: ~p~n', 100) = 'count: 100\n'

pad('abc', 5) = 'abc  '
pad('abc', 5, 'trailing') = 'abc  '
pad('abc', 5, 'both') = ' abc '
pad('abc', 5, 'leading') = '  abc'
pad('abc', 5, 'trailing', '*') = 'abc**'
pad('abc', 5, 'trailing', '*#') = 'abc*#*#'
pad('abc', 5, 'both', '*') = '*abc*'
pad('abc', 5, 'both', '*#') = '*#abc*#'
pad('abc', 5, 'leading', '*') = '**abc'
pad('abc', 5, 'leading', '*#') = '*#*#abc'

replace('ababef', 'ab', 'cd') = 'cdcdef'
replace('ababef', 'ab', 'cd', 'all') = 'cdcdef'
replace('ababef', 'ab', 'cd', 'trailing') = 'abcdef'
replace('ababef', 'ab', 'cd', 'leading') = 'cdabef'

regex_match('abc123', '[a-zA-Z1-9]*') = true

regex_replace('ab1cd3ef', '[1-9]', '[&]') = 'ab[1]cd[3]ef'
regex_replace('ccefacef', 'c+', ':') = ':efa:ef'

ascii('a') = 97

find('eeabcabcee', 'abc') = 'abcabcee'
find('eeabcabcee', 'abc', 'leading') = 'abcabcee'
find('eeabcabcee', 'abc', 'trailing') = 'abcee'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

# 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"
map_get('a', json_decode( '{ "a" : 1 }' )) = 1
map_get('b', json_decode( '{ "a" : 1 }' ), 2) = 2
map_get('a', map_put('a', 2, json_decode( '{ "a" : 1 }' ))) = 2
1
2
3

# 数组函数

函数名函数作用参数返回值
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 值
nth(2, [1,2,3,4]) = 2
length([1,2,3,4]) = 4
sublist(3, [1,2,3,4]) = [1,2,3,4]
sublist(1,2,[1,2,3,4]) = [1, 2]
first([1,2,3,4]) = 1
last([1,2,3,4]) = 4
contains(2, [1,2,3,4]) = true
1
2
3
4
5
6
7

# 哈希函数

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

# 压缩解压缩函数

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

bin2hexstr(zip('hello world')) = 'CB48CDC9C95728CF2FCA490100'
unzip(hexstr2bin('CB48CDC9C95728CF2FCA490100')) = 'hello world'

bin2hexstr(zip_compress('hello world')) = '789CCB48CDC9C95728CF2FCA4901001A0B045D'
zip_uncompress(hexstr2bin('789CCB48CDC9C95728CF2FCA4901001A0B045D')) = 'hello world'
1
2
3
4
5
6
7
8

# 比特操作函数

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

# 编解码函数

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

# 时间与日期函数

FunctionPurposeParametersReturned value
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 时间戳

时间戳精度

时间戳精度名称精度示例
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
now_timestamp() = 1650874276
now_timestamp('millisecond') = 1650874318331
now_rfc3339() = '2022-04-25T16:08:41+08:00'
now_rfc3339('millisecond') = '2022-04-25T16:10:10.652+08:00'
unix_ts_to_rfc3339(1650874276) = '2022-04-25T16:11:16+08:00'
unix_ts_to_rfc3339(1650874318331, 'millisecond') = '2022-04-25T16:11:58.331+08:00'
rfc3339_to_unix_ts('2022-04-25T16:11:16+08:00') = 1650874276
rfc3339_to_unix_ts('2022-04-25T16:11:58.331+08:00', 'millisecond') = 1650874318331
format_date('second', '+0800', '%Y-%m-%d %H:%M:%S%:z', 1653561612) = '2022-05-26 18:40:12+08:00'
format_date('second', 'local', '%Y-%m-%d %H:%M:%S%:z') = "2022-05-26 18:48:01+08:00"
format_date('second', 0, '%Y-%m-%d %H:%M:%S%:z') = '2022-05-26 10:42:41+00:00'
date_to_unix_ts('second', '%Y-%m-%d %H:%M:%S%:z', '2022-05-26 18:40:12+08:00') = 1653561612
date_to_unix_ts('second', 'local', '%Y-%m-%d %H-%M-%S', '2022-05-26 18:40:12') = 1653561612
date_to_unix_ts('second', '%Y-%m-%d %H-%M-%S', '2022-05-26 10:40:12') = 1653561612
1
2
3
4
5
6
7
8
9
10
11
12
13
14