文章

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) 计算ab次幂。
    • 示例:

      SELECT POWER(2, 3);
      
    • 结果:8

    • 示例:

      ```sql
      SELECT POW(2, 3);
      ```
      
    • 结果:8

    • 解释:23次幂为8

6. 平方根

  • 平方根:SQRT(number) 返回数字的平方根。
    • 示例:

      ```sql
      SELECT SQRT(16);
      ```
      
    • 结果:4

    • 解释:16的平方根是4

7. 对数

  • 自然对数:LN(number) 计算数字的自然对数。

    • 示例:

      ```sql
      SELECT LN(2.71828);
      ```
      
    • 结果:接近1

    • 解释:2.71828e的近似值,因此自然对数结果接近1

  • 常用对数(以10为底的对数):LOG10(number)

    • 示例:

      SELECT LOG10(100);
      
    • 结果:2

    • 解释:100的常用对数(log10)是2

  • 以2为底的对数:LOG2(number)

    • 示例:

      SELECT LOG2(8);
      
    • 结果:3

    • 解释:8log23,因为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_iduser_name字段的值)

    • 解释:将年龄大于30的用户user_iduser_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. 集合函数

用于处理集合类型的数据,如ARRAYMAP

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) 返回ab按位与的结果。

  • 示例:

    SELECT BITAND(5, 3) AS bit_and_result;
    
  • 结果:

    bit_and_result
    1
  • 解释:5的二进制表示为101,3的二进制表示为011,按位与结果为001(十进制为1)。

2. 按位或

  • BITOR(a, b) 返回ab按位或的结果。

    • 示例:

      SELECT BITOR(5, 3) AS bit_or_result;
      
    • 结果:

      bit_or_result
      7
    • 解释:5的二进制表示为101,3的二进制表示为011,按位或结果为111(十进制为7)。

3. 按位异或

  • BITXOR(a, b) 返回ab按位异或的结果。

  • 示例:

    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查询在正确的环境中执行。

License:  CC BY 4.0