FlinkSQL 内置函数
FlinkSQL 内置函数
Flink SQL中的系统(内置)函数官网说明:https://nightlies.apache.org/flink/flink-docs-master/zh/docs/dev/table/functions/systemfunctions/
1. 算术函数
用于执行数学计算的函数。
1. 加减乘除
-
加法:
+
-
示例:
-
SELECT 5 + 3;
-
结果:
8
-
解释:将两个数相加。
-
-
减法:
-
-
示例:
SELECT 10 - 4;
-
结果:
6
-
解释:将一个数从另一个数中减去。
-
-
乘法:
*
-
示例:
SELECT 6 * 7;
-
结果:
42
-
解释:两个数相乘。
-
-
除法:
/
-
示例:
SELECT 15 / 3;
-
结果:
5
-
解释:将一个数除以另一个数。
-
2. 取模
- 取模:
%
或MOD(a, b)
返回a
除以b
的余数。-
示例:
SELECT 10 % 3;
-
结果:
1
-
示例:
SELECT MOD(10, 3);
-
结果:
1
-
解释:
10
除以3
后,余数为1
。
-
3. 绝对值
- 绝对值:
ABS(number)
返回数字的绝对值。-
示例:
SELECT ABS(-10);
-
结果:
10
-
解释:
ABS
将负数-10
转为正数10
。
-
4. 取整
-
取上整:
CEIL(number)
向上取整。-
示例:
SELECT CEIL(4.3);
-
结果:
5
-
解释:将
4.3
向上取整为5
。
-
-
取下整:
FLOOR(number)
向下取整。-
示例:
SELECT FLOOR(4.7); ```
-
结果:
4
-
解释:将
4.7
向下取整为4
。
-
5. 幂运算
- 幂运算:
POWER(a, b)
或POW(a, b)
计算a
的b
次幂。-
示例:
SELECT POWER(2, 3);
-
结果:
8
-
示例:
```sql SELECT POW(2, 3); ```
-
结果:
8
-
解释:
2
的3
次幂为8
。
-
6. 平方根
- 平方根:
SQRT(number)
返回数字的平方根。-
示例:
```sql SELECT SQRT(16); ```
-
结果:
4
-
解释:
16
的平方根是4
。
-
7. 对数
-
自然对数:
LN(number)
计算数字的自然对数。-
示例:
```sql SELECT LN(2.71828); ```
-
结果:接近
1
-
解释:
2.71828
是e
的近似值,因此自然对数结果接近1
。
-
-
常用对数(以10为底的对数):
LOG10(number)
-
示例:
SELECT LOG10(100);
-
结果:
2
-
解释:
100
的常用对数(log10
)是2
。
-
-
以2为底的对数:
LOG2(number)
-
示例:
SELECT LOG2(8);
-
结果:
3
-
解释:
8
的log2
为3
,因为2^3 = 8
。
-
8. 三角函数
-
正弦:
SIN(number)
返回数字的正弦值。-
示例:
SELECT SIN(PI() / 2);
-
结果:
1
-
解释:
π/2
的正弦值是1
。
-
-
余弦:
COS(number)
返回数字的余弦值。-
示例:
SELECT COS(0);
-
结果:
1
-
解释:
0
的余弦值是1
。
-
-
正切:
TAN(number)
返回数字的正切值。-
示例:
SELECT TAN(PI() / 4);
-
结果:
1
-
解释:
π/4
的正切值是1
。
-
9. 反三角函数
-
反正弦:
ASIN(number)
返回数字的反正弦值,结果为弧度。-
示例:
SELECT ASIN(1);
-
结果:
1.57079632679
(约为π/2
) -
解释:
1
的反正弦值是π/2
。
-
-
反余弦:
ACOS(number)
返回数字的反余弦值,结果为弧度。-
示例:
SELECT ACOS(1);
-
结果:
0
-
解释:
1
的反余弦值是0
。
-
-
反正切:
ATAN(number)
返回数字的反正切值,结果为弧度。-
示例:
SELECT ATAN(1);
-
结果:
0.78539816339
(约为π/4
) -
解释:
1
的反正切值是π/4
。
-
2. 字符串函数
用于处理字符串的函数。
1. 长度
- 字符长度:
CHAR_LENGTH(string)
或LENGTH(string)
返回字符串的字符数。-
示例:
SELECT CHAR_LENGTH('Flink');
-
结果:
5
-
解释:字符串
'Flink'
的字符数是5
。
-
2. 子串
- 提取子串:
SUBSTRING(string, from [, for])
提取字符串的子串。-
示例:
SELECT SUBSTRING('FlinkSQL', 1, 5);
-
结果:
Flink
-
解释:从索引
1
开始,提取长度为5
的子串。
-
3. 大小写转换
-
转为大写:
UPPER(string)
将字符串转换为大写字母。-
示例:
SELECT UPPER('flink sql');
-
结果:
FLINK SQL
-
解释:将字符串
'flink sql'
转换为大写。
-
-
转为小写:
LOWER(string)
将字符串转换为小写字母。-
示例:
SELECT LOWER('FLINK SQL');
-
结果:
flink sql
-
解释:将字符串
'FLINK SQL'
转换为小写。
-
4. 去除空格
- 去除空格:
TRIM([LEADING|TRAILING|BOTH] [trim_character] FROM string)
去除字符串两端的空格。-
示例:
SELECT TRIM(BOTH ' ' FROM ' Flink ');
-
结果:
Flink
-
解释:去除字符串
' Flink '
两端的空格。
-
5. 字符串拼接
- 拼接字符串:
CONCAT(string1, string2, ...)
将多个字符串连接为一个。-
示例:
SELECT CONCAT('Flink', 'SQL');
-
结果:
FlinkSQL
-
解释:将
'Flink'
和'SQL'
拼接成一个字符串。
-
6. 替换
- 替换字符串:
REPLACE(string, search, replace)
将字符串中的部分内容替换为新内容。-
示例:
SELECT REPLACE('FlinkSQL', 'SQL', 'Stream');
-
结果:
FlinkStream
-
解释:将
'SQL'
替换为'Stream'
。
-
7. 定位
- 定位子串:
POSITION(substring IN string)
返回子串在字符串中的位置(从1开始)。-
示例:
SELECT POSITION('SQL' IN 'FlinkSQL');
-
结果:
6
-
解释:子串
'SQL'
在字符串'FlinkSQL'
中的起始位置是6
。
-
8. 反转
- 反转字符串:
REVERSE(string)
返回字符串的反向序列。-
示例:
SELECT REVERSE('Flink');
-
结果:
knilF
-
解释:将字符串
'Flink'
反转为'knilF'
。
-
9. 重复
- 重复字符串:
REPEAT(string, n)
将字符串重复n
次。-
示例:
SELECT REPEAT('Flink', 3);
-
结果:
FlinkFlinkFlink
-
解释:将字符串
'Flink'
重复3
次。
-
10. 格式化
- 格式化字符串:
FORMAT(format_string, arguments...)
按指定格式生成字符串。-
示例:
SELECT FORMAT('Hello, %s!', 'Flink');
-
结果:
Hello, Flink!
-
解释:将
'Flink'
插入到格式字符串中。
-
3. 日期和时间函数
用于处理日期和时间的函数。
1. 当前时间
-
当前日期:
CURRENT_DATE
返回当前日期。-
示例:
SELECT CURRENT_DATE;
-
结果:
2024-09-29
(示例,实际结果取决于当前日期) -
解释:返回当前的日期。
-
-
当前时间:
CURRENT_TIME
返回当前时间。-
示例:
SELECT CURRENT_TIME;
-
结果:
12:34:56
(示例,实际结果取决于当前时间) -
解释:返回当前的时间。
-
-
当前时间戳:
CURRENT_TIMESTAMP
返回当前的日期和时间。-
示例:
SELECT CURRENT_TIMESTAMP;
-
结果:
2024-09-29 12:34:56
(示例,实际结果取决于当前时间) -
解释:返回当前的日期和时间。
-
2. 时间戳转换
-
字符串转换为时间戳:
TO_TIMESTAMP(string)
将字符串转换为时间戳。-
示例:
SELECT TO_TIMESTAMP('2024-09-29 12:34:56');
-
结果:
2024-09-29 12:34:56
-
解释:将给定字符串解析为时间戳。
-
-
时间戳(带时区)转换:
TO_TIMESTAMP_LTZ(epoch, precision)
将epoch时间转换为本地时间戳。-
示例:
SELECT TO_TIMESTAMP_LTZ(1695989696, 3);
-
结果:
2024-09-29 12:34:56.789
(示例,具体结果取决于输入) -
解释:将给定的epoch时间转换为本地时间戳。
-
3. 日期格式化
- 日期格式化:
DATE_FORMAT(timestamp, format)
根据指定格式返回格式化的日期。-
示例:
SELECT DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-%d %H:%i:%s');
-
结果:
2024-09-29 12:34:56
(示例,实际结果取决于当前时间) -
解释:将当前时间戳格式化为指定的字符串格式。
-
4. 日期计算
-
日期加法:
DATE_ADD(date, interval)
向日期添加指定的时间间隔。-
示例:
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 7 DAY);
-
结果:
2024-10-06
(示例,实际结果取决于当前日期) -
解释:将当前日期增加
7
天。
-
-
日期减法:
DATE_SUB(date, interval)
从日期中减去指定的时间间隔。-
示例:
SELECT DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY);
-
结果:
2024-09-22
(示例,实际结果取决于当前日期) -
解释:将当前日期减去
7
天。
-
5. 提取日期部分
-
提取年份:
YEAR(date)
返回日期的年份部分。-
示例:
SELECT YEAR('2024-09-29');
-
结果:
2024
-
解释:提取日期
'2024-09-29'
的年份。
-
-
提取月份:
MONTH(date)
返回日期的月份部分。-
示例:
SELECT MONTH('2024-09-29');
-
结果:
9
-
解释:提取日期
'2024-09-29'
的月份。
-
-
提取天数:
DAY(date)
返回日期的天数部分。-
示例:
SELECT DAY('2024-09-29');
-
结果:
29
-
解释:提取日期
'2024-09-29'
的天数。
-
-
提取小时:
HOUR(time)
返回时间的小时部分。-
示例:
SELECT HOUR('12:34:56');
-
结果:
12
-
解释:提取时间
'12:34:56'
的小时。
-
-
提取分钟:
MINUTE(time)
返回时间的分钟部分。-
示例:
SELECT MINUTE('12:34:56');
-
结果:
34
-
解释:提取时间
'12:34:56'
的分钟。
-
-
提取秒数:
SECOND(time)
返回时间的秒数部分。-
示例:
SELECT SECOND('12:34:56');
-
结果:
56
-
解释:提取时间
'12:34:56'
的秒数。
-
6. Unix时间戳
-
获取当前Unix时间戳:
UNIX_TIMESTAMP()
返回当前的Unix时间戳。-
示例:
SELECT UNIX_TIMESTAMP();
-
结果:
1695989696
(示例,实际结果取决于当前时间) -
解释:返回当前时间的Unix时间戳。
-
-
从Unix时间戳转换为日期:
FROM_UNIXTIME(epoch)
将Unix时间戳转换为日期格式。-
示例:
SELECT FROM_UNIXTIME(1695989696);
-
结果:
2024-09-29 12:34:56
(示例,实际结果取决于输入) -
解释:将给定的Unix时间戳转换为可读的日期时间格式。
-
4. 类型转换函数
用于在不同数据类型之间进行转换。
1. 显式转换
- 类型转换:
CAST(value AS type)
将值转换为指定的数据类型。-
示例:
SELECT CAST('2024-09-29' AS DATE);
-
结果:
2024-09-29
-
解释:将字符串
'2024-09-29'
转换为日期类型。
-
2. JSON序列化
- 序列化为JSON:
TO_JSON(value)
将值转换为JSON格式。-
示例:
SELECT TO_JSON(ROW(1, 'Flink', 3.14));
-
结果:
{"f0":1,"f1":"Flink","f2":3.14}
-
解释:将行数据序列化为JSON格式。
-
3. JSON解析
- 解析JSON:
FROM_JSON(json_string, schema)
将JSON字符串解析为指定的结构。-
示例:
SELECT FROM_JSON('{"name": "Flink", "version": "1.0"}', 'ROW(name STRING, version STRING));
-
结果:
{"name": "Flink", "version": "1.0"}
-
解释:将JSON字符串解析为定义的行结构。
-
5. 条件函数
用于执行条件判断的函数。
1. NULL判断
-
判断是否为NULL:
IS NULL
检查值是否为NULL。-
示例:
SELECT 'Value is NULL' WHERE NULL IS NULL;
-
结果:
Value is NULL
-
解释:检查NULL值并返回相应字符串。
-
-
判断是否不为NULL:
IS NOT NULL
检查值是否不为NULL。-
示例:
SELECT 'Value is NOT NULL' WHERE 'Flink' IS NOT NULL;
-
结果:
Value is NOT NULL
-
解释:检查非NULL值并返回相应字符串。
-
2. COALESCE
- 返回第一个非NULL值:
COALESCE(value1, value2, ...)
返回第一个非NULL值。-
示例:
SELECT COALESCE(NULL, NULL, 'Flink', 'SQL');
-
结果:
Flink
-
解释:返回第一个非NULL的值
'Flink'
。
-
3. NULLIF
- 判断是否相等:
NULLIF(value1, value2)
如果value1 = value2
则返回NULL,否则返回value1
。-
示例:
SELECT NULLIF('Flink', 'Flink');
-
结果:
NULL
-
解释:因为两个值相等,所以返回NULL。
-
4. 条件表达式
- 条件判断:
CASE WHEN condition THEN result [WHEN ...] ELSE result END
根据条件返回不同的结果。-
示例:
SELECT CASE WHEN 1 = 1 THEN 'True' ELSE 'False' END;
-
结果:
True
-
解释:因为条件成立,所以返回
'True'
。
-
6. 聚合函数
用于对一组值进行计算,返回单一结果。
1. 计数
-
计数所有行:
COUNT(*)
返回结果集中的行数。-
示例:
SELECT COUNT(*) FROM my_table;
-
结果:
100
-
解释:返回表
my_table
中的总行数。
-
-
计数特定表达式:
COUNT(expression)
返回满足条件的非NULL值的数量。-
示例:
SELECT COUNT(column_name) FROM my_table;
-
结果:
80
-
解释:计算列
column_name
中非NULL值的数量。
-
2. 求和
- 求和:
SUM(expression)
返回指定列的所有值之和。-
示例:
SELECT SUM(salary) FROM employees;
-
结果:
500000
-
解释:计算
employees
表中salary
列的总和。
-
3. 平均值
- 平均值:
AVG(expression)
返回指定列的平均值。-
示例:
SELECT AVG(score) FROM exams;
-
结果:
85.5
-
解释:计算
exams
表中score
列的平均值。
-
4. 最大/最小值
-
最大值:
MAX(expression)
返回指定列的最大值。-
示例:
SELECT MAX(age) FROM users;
-
结果:
65
-
解释:计算
users
表中age
列的最大值。
-
-
最小值:
MIN(expression)
返回指定列的最小值。-
示例:
SELECT MIN(age) FROM users;
-
结果:
18
-
解释:计算
users
表中age
列的最小值。
-
5. 统计函数
-
总体标准差:
STDDEV_POP(expression)
返回总体标准差。-
示例:
SELECT STDDEV_POP(salary) FROM employees;
-
结果:
15000
-
解释:计算
employees
表中salary
列的总体标准差。
-
-
样本标准差:
STDDEV_SAMP(expression)
返回样本标准差。-
示例:
SELECT STDDEV_SAMP(salary) FROM employees;
-
结果:
16000
-
解释:计算
employees
表中salary
列的样本标准差。
-
-
总体方差:
VAR_POP(expression)
返回总体方差。-
示例:
SELECT VAR_POP(salary) FROM employees;
-
结果:
225000000
-
解释:计算
employees
表中salary
列的总体方差。
-
-
样本方差:
VAR_SAMP(expression)
返回样本方差。-
示例:
SELECT VAR_SAMP(salary) FROM employees;
-
结果:
256000000
-
解释:计算
employees
表中salary
列的样本方差。
-
7. 表值聚合函数
用于将多行数据聚合成复杂类型的数据。
1. 集合聚合
- 将多行数据收集到数组:
COLLECT(expression)
将多行数据收集到一个数组中。-
示例:
SELECT COLLECT(user_id) FROM users WHERE age > 30;
-
结果:
[1001, 1002, 1003]
(示例,实际结果取决于user_id
的值) -
解释:将年龄大于30的
user_id
字段收集到一个数组中。
-
2. 数组聚合
- 将表达式的值聚合成数组:
ARRAY_AGG(expression)
将多个表达式的值聚合成一个数组。-
示例:
SELECT ARRAY_AGG(score) FROM exams WHERE subject = 'Math';
-
结果:
[85, 90, 78]
(示例,实际结果取决于score
字段的值) -
解释:将数学考试中的
score
字段聚合成一个数组。
-
3. 映射聚合
- 将键值对聚合成MAP:
MAP_AGG(key, value)
将多个键值对聚合成一个MAP。-
示例:
SELECT MAP_AGG(user_id, user_name) FROM users WHERE age > 30;
-
结果:
{1001: 'Alice', 1002: 'Bob', 1003: 'Charlie'}
(示例,实际结果取决于user_id
和user_name
字段的值) -
解释:将年龄大于30的用户
user_id
和user_name
字段聚合成一个MAP。
-
8. JSON函数
用于处理JSON格式的数据。
1. 解析JSON
- 提取JSON中的值:
JSON_VALUE(json_string, path)
提取JSON字符串中特定路径下的值。-
示例:
SELECT JSON_VALUE('{"name": "Alice", "age": 30}', '$.name');
-
结果:
Alice
-
解释:从JSON字符串中提取
name
字段的值"Alice"
。
-
2. JSON_EXISTS
- 检查JSON路径是否存在:
JSON_EXISTS(json_string, path)
检查指定的JSON路径在JSON字符串中是否存在。-
示例:
SELECT JSON_EXISTS('{"name": "Alice", "age": 30}', '$.age');
-
结果:
TRUE
-
解释:检查JSON字符串中
age
字段是否存在,结果为TRUE
。
-
3. JSON_QUERY
- 提取JSON对象或数组:
JSON_QUERY(json_string, path)
提取JSON字符串中的对象或数组。-
示例:
SELECT JSON_QUERY('{"employees": [{"name": "Alice"}, {"name": "Bob"}]}', '$.employees');
-
结果:
[{"name": "Alice"}, {"name": "Bob"}]
-
解释:从JSON字符串中提取
employees
数组。
-
9. 地理空间函数
用于处理地理空间数据。
1. 创建点
- 创建地理空间点对象:
ST_POINT(lng, lat)
创建一个包含经纬度坐标的点。-
示例:
SELECT ST_POINT(30.2672, -97.7431);
-
结果:
POINT(30.2672 -97.7431)
-
解释:创建一个位于经度30.2672、纬度-97.7431的地理点,通常表示奥斯汀市的坐标。
-
2. 计算距离
- 计算两个点之间的距离:
ST_DISTANCE(geom1, geom2)
计算两个地理对象之间的距离。-
示例:
SELECT ST_DISTANCE(ST_POINT(30.2672, -97.7431), ST_POINT(34.0522, -118.2437));
-
结果:
2151.16
(假设单位是公里) -
解释:计算奥斯汀(经纬度30.2672, -97.7431)与洛杉矶(经纬度34.0522, -118.2437)之间的地理距离。
-
3. 空间关系
a. 包含关系
- 检查第一个几何对象是否包含第二个对象:
ST_CONTAINS(geom1, geom2)
-
示例:
SELECT ST_CONTAINS(ST_POINT(30.2672, -97.7431), ST_POINT(30.2672, -97.7431));
-
结果:
TRUE
-
解释:检查第一个点是否包含第二个点,在这个示例中是相同的点,因此返回
TRUE
。
-
b. 相交关系
- 检查两个几何对象是否相交:
ST_INTERSECTS(geom1, geom2)
-
示例:
SELECT ST_INTERSECTS(ST_POINT(30.2672, -97.7431), ST_POINT(34.0522, -118.2437));
-
结果:
FALSE
-
解释:检查奥斯汀的点和洛杉矶的点是否相交,结果是
FALSE
,因为它们是不同的点。
-
10. 哈希函数
用于生成数据的哈希值。
1. MD5哈希
- 生成MD5哈希值:
MD5(string)
计算字符串的MD5哈希值。-
示例:
SELECT MD5('Hello World');
-
结果:
FC3FF98E8C6A0D3087D515C0473F8677
-
解释:将字符串
"Hello World"
转换成对应的MD5哈希值。
-
2. SHA哈希
a. SHA1哈希
- 生成SHA-1哈希值:
SHA1(string)
计算字符串的SHA-1哈希值。-
示例:
SELECT SHA1('Hello World');
-
结果:
2EF7BDE608CE5404E97D5F042F95F89F1C232871
-
解释:将字符串
"Hello World"
转换为SHA-1哈希值。
-
b. SHA224哈希
- 生成SHA-224哈希值:
SHA224(string)
计算字符串的SHA-224哈希值。-
示例:
SELECT SHA224('Hello World');
-
结果:
C4890FAFDB2B6AE4E1C8154EF9A3E7BCE6AEBE1A63B72E5F8F8CFF4E
-
解释:将字符串
"Hello World"
转换为SHA-224哈希值。
-
c. SHA256哈希
- 生成SHA-256哈希值:
SHA256(string)
计算字符串的SHA-256哈希值。-
示例:
SELECT SHA256('Hello World');
-
结果:
A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B53D20D71B88C241C
-
解释:将字符串
"Hello World"
转换为SHA-256哈希值。
-
d. SHA384哈希
- 生成SHA-384哈希值:
SHA384(string)
计算字符串的SHA-384哈希值。-
示例:
SELECT SHA384('Hello World');
-
结果:
99514329186B2F6AE4A6300D1FBD03C514B38C79B35E84D41FCE4501486E3F2D62ACFAEBAF5730F99A95BEB4196D559C
-
解释:将字符串
"Hello World"
转换为SHA-384哈希值。
-
e. SHA512哈希
- 生成SHA-512哈希值:
SHA512(string)
计算字符串的SHA-512哈希值。-
示例:
SELECT SHA512('Hello World');
-
结果:
2C74FD17EDAFD80E8447B0D46741EE243B7EB74D0B5C2BF3B1772F636E77E2D7017E09D1F8A5BFBFFB223523C0D43AFA8D43D2E6D4F1C3F3C908BBD5C43E4A7A
-
解释:将字符串
"Hello World"
转换为SHA-512哈希值。
-
11. 加密和编码函数
用于对数据进行加密或编码。
1. BASE64编码
a. BASE64编码
- 将字符串进行BASE64编码:
TO_BASE64(string)
对输入字符串进行BASE64编码。-
示例:
SELECT TO_BASE64('Hello World');`
-
结果:
SGVsbG8gV29ybGQ=
-
解释:将字符串
"Hello World"
转换为其BASE64编码格式"SGVsbG8gV29ybGQ="
。
-
b. BASE64解码:FROM_BASE64(encoded_string)
- 将BASE64编码字符串解码:
FROM_BASE64(encoded_string)
对BASE64编码的字符串进行解码。-
示例:
SELECT FROM_BASE64('SGVsbG8gV29ybGQ=');
-
结果:
Hello World
-
解释:将BASE64编码字符串
"SGVsbG8gV29ybGQ="
解码回原始字符串"Hello World"
。
-
2. URL编码
a. URL编码
- 将字符串进行URL编码:
ENCODE(string, charset)
按照指定的字符集对字符串进行URL编码。-
示例:
SELECT ENCODE('Hello World!', 'UTF-8');
-
结果:
Hello%20World%21
-
解释:将字符串
"Hello World!"
按照UTF-8
字符集进行URL编码,空格变为%20
,感叹号变为%21
。
-
b. URL解码:
- 将URL编码字符串解码:
DECODE(encoded_string, charset)
按照指定的字符集对URL编码的字符串进行解码。-
示例:
SELECT DECODE('Hello%20World%21', 'UTF-8');
-
结果:
Hello World!
-
解释:将URL编码的字符串
"Hello%20World%21"
解码回原始的"Hello World!"
字符串。
-
12. 正则表达式函数
用于匹配和替换字符串。
1. 匹配
- 检查字符串是否符合正则表达式模式:
REGEXP_LIKE(string, pattern)
用于检查给定字符串是否匹配某个正则表达式模式。-
示例:
SELECT REGEXP_LIKE('Hello123', '^[A-Za-z]+$');
-
结果:
false
-
解释:
"Hello123"
包含数字,无法完全匹配模式'^[A-Za-z]+$'
,因此结果为false
。
-
2. 替换
- 使用正则表达式替换字符串:
REGEXP_REPLACE(string, pattern, replacement)
使用正则表达式找到字符串中与模式匹配的部分,并将其替换为指定的替换文本。-
示例:
SELECT REGEXP_REPLACE('Hello123 World456', '[0-9]+', '');
-
结果:
Hello World
-
解释:将字符串
"Hello123 World456"
中的所有数字通过正则表达式'[0-9]+'
匹配,并替换为空字符串,结果为"Hello World"
。
-
3. 提取
- 从字符串中提取与正则表达式匹配的子串:
REGEXP_EXTRACT(string, pattern, [index])
提取给定字符串中与正则表达式模式匹配的部分,返回指定的捕获组(默认为第一个匹配的组)。-
示例:
SELECT REGEXP_EXTRACT('Order ID: 12345', 'Order ID: ([0-9]+)', 1);
-
结果:
12345
-
解释:正则表达式
'Order ID: ([0-9]+)'
匹配字符串"Order ID: 12345"
,并提取出括号中的第一组,也就是数字12345
。
-
13. 集合函数
用于处理集合类型的数据,如ARRAY
和MAP
。
1. 数组元素
- 获取数组中的元素:
ELEMENT(array)
从数组中提取出某个特定元素。-
示例:
SELECT ELEMENT([1, 2, 3, 4]);
-
结果:
1
-
解释:该函数返回数组的第一个元素,结果为
1
。
-
2. 数组大小
- 返回数组的大小:
CARDINALITY(array)
计算并返回数组中的元素数量。-
示例:
SELECT CARDINALITY([1, 2, 3, 4]);
-
结果:
4
-
解释:该数组有4个元素,因此函数返回数组的大小
4
。
-
3. 数组包含
- 检查数组是否包含某个值:
ARRAY_CONTAINS(array, value)
检查指定的值是否在数组中存在。-
示例:
SELECT ARRAY_CONTAINS([1, 2, 3, 4], 3);
-
结果:
true
-
解释:检查数组
[1, 2, 3, 4]
是否包含值3
,返回true
。
-
4. 映射键
- 获取MAP中的键集合:
MAP_KEYS(map)
提取出MAP中的所有键并返回它们作为数组。-
示例:
SELECT MAP_KEYS(MAP['key1', 'value1', 'key2', 'value2']);
-
结果:
['key1', 'key2']
-
解释:从MAP
{'key1': 'value1', 'key2': 'value2'}
中提取键,返回数组['key1', 'key2']
。
-
5. 映射值
- 获取MAP中的值集合:
MAP_VALUES(map)
提取出MAP中的所有值并返回它们作为数组。-
示例:
SELECT MAP_VALUES(MAP['key1', 'value1', 'key2', 'value2']);
-
结果:
['value1', 'value2']
-
解释:从MAP
{'key1': 'value1', 'key2': 'value2'}
中提取值,返回数组['value1', 'value2']
。
-
14. 窗口函数
用于在指定窗口内进行计算。
1. 排名函数
-
返回分区内行的唯一行号:
ROW_NUMBER()
在每个分区的结果中按顺序分配唯一的行号。- 示例:
SELECT user_id, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as rank FROM employees;
- 结果:
user_id rank 101 1 102 2 103 3 - 解释:该函数按
department
分区并根据salary
排序,为每行分配一个递增的行号。
- 示例:
-
返回分区内的排名,跳过重复排名:
RANK()
根据排序条件分配排名,相同值的行会有相同的排名,之后的排名会跳过。- 示例:
SELECT user_id, RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank FROM employees;
- 结果:
user_id rank 101 1 102 2 103 3 - 解释:根据
salary
排序,若两行有相同salary
,它们会共享相同的排名,下一排名会跳过。
- 示例:
-
返回分区内的紧密排名,不跳过排名:
DENSE_RANK()
和RANK()
类似,但不跳过重复排名后的下一个排名。- 示例:
SELECT user_id, DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dense_rank FROM employees;
- 结果:
user_id dense_rank 101 1 102 2 103 3 - 解释:不同于
RANK()
,即使有相同的值,排名仍然是连续的,不会跳过。
- 示例:
2. 取值函数
-
返回窗口中的第一个值:
FIRST_VALUE(expression)
返回按指定顺序排列的窗口中的第一个值。- 示例:
SELECT user_id, FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY hire_date ASC) as first_salary FROM employees;
- 结果:
user_id first_salary 101 50000 102 50000 103 50000 - 解释:按
hire_date
升序排序,返回分区内最早雇用员工的salary
。
- 示例:
-
返回窗口中的最后一个值:
LAST_VALUE(expression)
返回按指定顺序排列的窗口中的最后一个值。- 示例:
SELECT user_id, LAST_VALUE(salary) OVER (PARTITION BY department ORDER BY hire_date ASC) as last_salary FROM employees;
- 结果:
user_id last_salary 101 70000 102 70000 103 70000 - 解释:按
hire_date
升序排序,返回分区内最新雇用员工的salary
。
- 示例:
3. 偏移函数
-
返回前
offset
行的值:LAG(expression, offset)
提取当前行前offset
行的值,若无前offset
行,则返回NULL。- 示例:
SELECT user_id, salary, LAG(salary, 1) OVER (PARTITION BY department ORDER BY hire_date ASC) as previous_salary FROM employees;
- 结果:
user_id salary previous_salary 101 50000 NULL 102 60000 50000 103 70000 60000 - 解释:返回当前行的前一行的
salary
。
- 示例:
-
返回后
offset
行的值:LEAD(expression, offset)
提取当前行后offset
行的值,若无后offset
行,则返回NULL。- 示例:
SELECT user_id, salary, LEAD(salary, 1) OVER (PARTITION BY department ORDER BY hire_date ASC) as next_salary FROM employees;
- 结果:
user_id salary next_salary 101 50000 60000 102 60000 70000 103 70000 NULL - 解释:返回当前行的下一行的
salary
。
- 示例:
15. 随机函数
用于生成随机数。
1. 随机数
- 生成一个0到1之间的随机浮点数:
RAND()
函数返回一个均匀分布的伪随机数,范围在0(包括0)到1(不包括1)之间。- 示例:
SELECT RAND() AS random_value FROM dual;
- 结果:
random_value 0.3745 0.8973 0.2564 - 解释:每次调用
RAND()
函数都会生成一个新的随机浮点数。
- 示例:
2. 随机整数
- 生成一个指定范围内的随机整数:
RAND_INTEGER(bound)
函数返回一个在0到bound
之间的随机整数,包含0但不包括bound
。- 示例:
SELECT RAND_INTEGER(10) AS random_integer FROM dual;
- 结果:
random_integer 3 7 0 - 解释:每次调用
RAND_INTEGER(10)
都会生成一个在0到9之间的随机整数。
- 示例:
16. 位运算函数
用于对整数进行位操作。
1. 按位与
-
BITAND(a, b) 返回
a
和b
按位与的结果。 -
示例:
SELECT BITAND(5, 3) AS bit_and_result;
-
结果:
bit_and_result 1 -
解释:5的二进制表示为
101
,3的二进制表示为011
,按位与结果为001
(十进制为1)。
2. 按位或
-
BITOR(a, b) 返回
a
和b
按位或的结果。-
示例:
SELECT BITOR(5, 3) AS bit_or_result;
-
结果:
bit_or_result 7 -
解释:5的二进制表示为
101
,3的二进制表示为011
,按位或结果为111
(十进制为7)。
-
3. 按位异或
-
BITXOR(a, b) 返回
a
和b
按位异或的结果。 -
示例:
SELECT BITXOR(5, 3) AS bit_xor_result;
-
结果:
bit_xor_result 6 -
解释:5的二进制表示为
101
,3的二进制表示为011
,按位异或结果为110
(十进制为6)。
4. 位反转
-
BITNOT(a) 返回
a
的位反转结果。-
示例:
SELECT BITNOT(5) AS bit_not_result;
-
结果:
bit_not_result -6 -
解释:5的二进制表示为
0000 0101
,位反转结果为1111 1010
(十进制为-6)。
-
5. 位移
-
SHIFTL(a, n) 将
a
的位向左移动n
位,右侧用0填充。 -
示例:
SELECT SHIFTL(5, 1) AS shift_left_result;
-
结果:
shift_left_result 10 -
解释:5的二进制表示为
0000 0101
,左移1位后为0000 1010
(十进制为10)。 -
SHIFTR(a, n) 将
a
的位向右移动n
位。 -
示例:
SELECT SHIFTR(5, 1) AS shift_right_result;
-
结果:
shift_right_result 2 -
解释:5的二进制表示为
0000 0101
,右移1位后为0000 0010
(十进制为2)。
17. 其他函数
用于提供类型、会话和系统信息的函数。
1. 类型信息
-
TYPEOF(expression) 返回给定表达式的数据类型。
-
示例:
SELECT TYPEOF(123) AS data_type_numeric, TYPEOF('hello') AS data_type_string, TYPEOF(CURRENT_DATE) AS data_type_date;
-
结果:
data_type_numeric data_type_string data_type_date INTEGER STRING DATE -
解释:此函数可以帮助用户理解当前表达式的类型,以便进行更好的数据处理。
-
2. 会话信息
-
SESSION_USER 返回当前会话的用户名称。
-
示例:
SELECT SESSION_USER AS current_session_user;
-
结果:
current_session_user user123 -
解释:此函数有助于跟踪当前会话的活动用户。
-
-
CURRENT_USER 返回当前执行 SQL 语句的用户名称。
-
示例:
SELECT CURRENT_USER AS executing_user;
-
结果:
executing_user user123 -
解释:此函数与
SESSION_USER
类似,但可以用于获取当前执行 SQL 语句的用户信息。
3. 系统信息
-
SYSTEM_VERSION 返回系统的版本信息。
-
示例:
SELECT SYSTEM_VERSION AS flink_version;
-
结果:
flink_version 1.14.0 -
解释:此函数可以帮助用户了解正在使用的Flink版本,以便进行兼容性检查。
-
VERSION() 返回当前数据库系统的版本。
-
示例:
SELECT VERSION() AS database_version;
-
结果:
database_version Apache Flink 1.14.0 -
解释:此函数用于获取数据库的版本信息,有助于用户确保其SQL查询在正确的环境中执行。
-