数组操作函数
数组操作函数对输入的数组数据进行一些基本操作,如添加元素、删除元素、查找元素,并返回操作后的数组数据。seekdb 当前所支持的数组操作函数包括 array_append()、arrar_distinct()、array_remove()、cardinality()、element_at()、string_to_array()、array_agg()、unnest()、split() 和 contains()。
array_append
array_append() 函数用于向目标数组中新增指定元素。语法如下:
array_append(arr1, element)
输入参数说明如下:
arr1为基础数组时,element应为数组支持的基础类型,支持 Tinyint、Smallint、Int、Bigint、Float、Double、VarChar 类型。arr1为嵌套数组时,element应为数组,其嵌套层数应等于arr1的子数组的嵌套层数。
返回值为数组类型。
示例如下:
SELECT array_append([1,2,3], 2);
+--------------------------+
| array_append([1,2,3], 2) |
+--------------------------+
| [1,2,3,2] |
+--------------------------+
1 row in set (0.001 sec)
SELECT array_append([1,2,3], -1);
+---------------------------+
| array_append([1,2,3], -1) |
+---------------------------+
| [1,2,3,-1] |
+---------------------------+
1 row in set (0.001 sec)
SELECT array_append(["1", "2", "a"], "OceanBase");
+--------------------------------------------+
| array_append(["1", "2", "a"], "OceanBase") |
+--------------------------------------------+
| ["1","2","a","OceanBase"] |
+--------------------------------------------+
1 row in set (0.001 sec)
SELECT array_append([[1,2],[3,4]], [5]);
+----------------------------------+
| array_append([[1,2],[3,4]], [5]) |
+----------------------------------+
| [[1,2],[3,4],[5]] |
+----------------------------------+
1 row in set (0.001 sec)
array_distinct
array_distinct() 函数用于对目标数组进行去重操作。语法如下:
array_distinct(arr1)
输入参数说明如下:
arr1传入的类型必须是一个数组类型。
返回值为数组类型。
如果数组的元素类型不一致(如字符串型数组与数值型数组),会报错。
示例如下:
SELECT array_distinct([1,2,3,2,3]);
+-----------------------------+
| array_distinct([1,2,3,2,3]) |
+-----------------------------+
| [1,2,3] |
+-----------------------------+
1 row in set (0.001 sec)
SELECT array_distinct([null,2,3,null]);
+-----------------------------+
| array_distinct([null,2,3,null]) |
+---------------------------------+
| [NULL,2,3] |
+---------------------------------+
1 row in set (0.001 sec)
SELECT array_distinct([1,2,3,2.0]);
+-----------------------------+
| array_distinct([1,2,3,2.0]) |
+-----------------------------+
| [1,2,3] |
+-----------------------------+
1 row in set (0.001 sec)
SELECT array_distinct([1.1,2.2,3.3,2.2]);
+-------------------------------+
| array_distinct([1.1,2.2,3.3,2.2]) |
+-----------------------------------+
| [1.1,2.2,3.3] |
+-----------------------------------+
1 row in set (0.001 sec)
SELECT array_distinct(["hello", "hi", "hi"]);
+---------------------------------------+
| array_distinct(["hello", "hi", "hi"]) |
+---------------------------------------+
| ["hello","hi"] |
+---------------------------------------+
1 row in set (0.001 sec)
SELECT array_distinct([[1,2],[3,4], [3,4]]);
+--------------------------------------+
| array_distinct([[1,2],[3,4], [3,4]]) |
+--------------------------------------+
| [[1,2],[3,4]] |
+--------------------------------------+
1 row in set (0.001 sec)
SELECT array_distinct([["hello", "world"], ["hi", "what"], ["are you?"], ["are you?"]]);
+----------------------------------------------------------------------------------+
| array_distinct([["hello", "world"], ["hi", "what"], ["are you?"], ["are you?"]]) |
+----------------------------------------------------------------------------------+
| [["hello","world"],["hi","what"],["are you?"]] |
+----------------------------------------------------------------------------------+
1 row in set (0.001 sec)
array_remove
array_remove() 函数用于对目标数组进行删除指定元素操作。语法如下:
array_remove(arr1, element)
输入参数说明如下:
arr1为基础数组时,element应为数组支持的基础类型,支持 Tinyint、Smallint、Int、Bigint、Float、Double、VarChar 类型。arr1为嵌套数组时,element应为数组,其嵌套层数应等于arr1的子数组的嵌套层数。
返回值为数组类型。
示例如下:
SELECT array_remove([1,2,3], 2);
+--------------------------+
| array_remove([1,2,3], 2) |
+--------------------------+
| [1,3] |
+--------------------------+
1 row in set (0.001 sec)
SELECT array_remove([1,2,3], 2.0);
+----------------------------+
| array_remove([1,2,3], 2.0) |
+----------------------------+
| [1,3] |
+----------------------------+
1 row in set (0.001 sec)
SELECT array_remove([1.1,2.2,3.3], 2.2);
+----------------------------------+
| array_remove([1.1,2.2,3.3], 2.2) |
+----------------------------------+
| [1.1,3.3] |
+----------------------------------+
1 row in set (0.001 sec)
SELECT array_remove(["hello", "hi"], "hi");
+-------------------------------------+
| array_remove(["hello", "hi"], "hi") |
+-------------------------------------+
| ["hello"] |
+-------------------------------------+
1 row in set (0.001 sec)
SELECT array_remove([[1,2],[3,4]], [3,4]);
+------------------------------------+
| array_remove([[1,2],[3,4]], [3,4]) |
+------------------------------------+
| [[1,2]] |
+------------------------------------+
1 row in set (0.001 sec)
SELECT array_remove([[1,2],[3,4]], [3.0,4.0]);
+----------------------------------------+
| array_remove([[1,2],[3,4]], [3.0,4.0]) |
+----------------------------------------+
| [[1,2]] |
+----------------------------------------+
1 row in set (0.001 sec)
SELECT array_remove([["hello", "world"], ["hi", "what"], ["are you?"]], ["are you?"]);
+--------------------------------------------------------------------------------+
| array_remove([["hello", "world"], ["hi", "what"], ["are you?"]], ["are you?"]) |
+--------------------------------------------------------------------------------+
| [["hello","world"],["hi","what"]] |
+--------------------------------------------------------------------------------+
1 row in set (0.001 sec)
cardinality
cardinality() 函数用于返回目标数组的基础元素数量。若目标数组为嵌套数组,则返回其所有非空子数组的基础元素数量之和。语法如下:
cardinality(arr1)
输入参数说明如下:
arr1传入的类型必须是一个数组类型。
返回值为整数类型。
示例如下:
SELECT cardinality([1,2,3]);
+----------------------+
| cardinality([1,2,3]) |
+----------------------+
| 3 |
+----------------------+
1 row in set (0.001 sec)
SELECT cardinality([1,2,3,NULL]);
+----------------------------+
| cardinality([1,2,3,NULL]) |
+----------------------------+
| 4 |
+----------------------------+
1 row in set (0.001 sec)
SELECT cardinality(['a','b','c','d']);
+----------------------------+
| cardinality(['a','b','c','d']) |
+----------------------------+
| 4 |
+----------------------------+
1 row in set (0.001 sec)
SELECT cardinality([[1,2,3],[4]]);
+----------------------------+
| cardinality([[1,2,3],[4]]) |
+----------------------------+
| 4 |
+----------------------------+
1 row in set (0.001 sec)
SELECT cardinality([['a','b',NULL,'c'],[NULL,'d']]);
+----------------------------------------------+
| cardinality([['a','b',NULL,'c'],[NULL,'d']]) |
+----------------------------------------------+
| 6 |
+----------------------------------------------+
1 row in set (0.001 sec)
SELECT cardinality([[1,2,3],NULL]);
+-----------------------------+
| cardinality([[1,2,3],NULL]) |
+-----------------------------+
| 3 |
+-----------------------------+
1 row in set (0.001 sec)
element_at
element_at() 函数根据索引,返回目标数组中指定位置的元素。语法如下:
element_at(arr1, index)
输入参数说明如下:
arr1传入的类型必须是一个数组类型。index需要获取的子元素的位置,支持整数类型。
返回值说明如下:
- 若
arr1为嵌套数组,返回类型为数组。 - 若
arr1为基础类型,返回类型为相应的基础类型。
示例如下:
SELECT element_at([1,2,3], 2);
+------------------------+
| element_at([1,2,3], 2) |
+------------------------+
| 2 |
+------------------------+
1 row in set (0.001 sec)
SELECT element_at([1,2,3], 4);
+------------------------+
| element_at([1,2,3], 4) |
+------------------------+
| NULL |
+------------------------+
1 row in set (0.001 sec)
SELECT element_at(['a',NULL,'bb','ccc'], 4);
+--------------------------------------+
| element_at(['a',NULL,'bb','ccc'], 4) |
+--------------------------------------+
| ccc |
+--------------------------------------+
1 row in set (0.001 sec)
SELECT element_at([[1,2],[3,4]], 1);
+------------------------------+
| element_at([[1,2],[3,4]], 1) |
+------------------------------+
| [1,2] |
+------------------------------+
1 row in set (0.001 sec)
SELECT element_at([["hello", "world"], ["hi", "what"], ["are you?"]], 3);
+-------------------------------------------------------------------+
| element_at([["hello", "world"], ["hi", "what"], ["are you?"]], 3) |
+-------------------------------------------------------------------+
| ["are you?"] |
+-------------------------------------------------------------------+
1 row in set (0.001 sec)
string_to_array
string_to_array() 函数用于将字符转换为数组。具体而言,即根据指定的分隔符和空元素符将输入的字符拆分成多个元素,再将元素依次放入一个数组中。分隔符和空元素符大小写敏感。语法如下:
string_to_array(arr_str, delimiter[, null_str])
输入参数说明如下:
arr_str传入的类型必须是一个字符类型,包含 Char、Varchar 类型。delimiter分隔符,支持字符类型,包含 Char、Varchar 类型。null_str(可选) 空元素符,支持字符类型,包含 Char、Varchar 类型。
返回值为元素为字符的数组类型。
示例如下:
SELECT string_to_array('1and2and3and', 'and');
+----------------------------------------+
| string_to_array('1and2and3and', 'and') |
+----------------------------------------+
| ["1","2","3",""] |
+----------------------------------------+
1 row in set (0.001 sec)
SELECT string_to_array('1,2,3', '');
+------------------------------+
| string_to_array('1,2,3', '') |
+------------------------------+
| ["1,2,3"] |
+------------------------------+
1 row in set (0.001 sec)
SELECT string_to_array('1andNULLand3andNULL', 'and', 'NULL');
+-------------------------------------------------------+
| string_to_array('1andNULLand3andNULL', 'and', 'NULL') |
+-------------------------------------------------------+
| ["1",NULL,"3",NULL] |
+-------------------------------------------------------+
1 row in set (0.001 sec)
split
split() 函数用于将字符串 string 按分隔符 delimiter 进行分隔,并返回数组。语法如下:
split(string, delimiter)
参数说明如下:
-
string和delimiter均为VARCHAR类型。 -
返回值类型为
ARRAY<varchar>。
示例如下:
SELECT split('1#2#3', '#'), split('#1#2#3#', '#'), split('123', '#');
+---------------------+-----------------------+-------------------+
| split('1#2#3', '#') | split('#1#2#3#', '#') | split('123', '#') |
+---------------------+-----------------------+-------------------+
| ["1","2","3"] | ["","1","2","3",""] | ["123"] |
+---------------------+-----------------------+-------------------+
contains
contains() 函数用于检查某个元素是否存在于指定的容器或字符串中,并返回一个布尔值。语法如下:
CONTAINS(array_expr, value)
示例如下:
SELECT CONTAINS([1, 2, 3, 4, 5], 3), CONTAINS([1, 2, 3, 4, 5], 6), CONTAINS(['a', 'b', 'c'], 'b'), CONTAINS(['a', 'b', 'c'], 'd');
+------------------------------+------------------------------+--------------------------------+--------------------------------+
| CONTAINS([1, 2, 3, 4, 5], 3) | CONTAINS([1, 2, 3, 4, 5], 6) | CONTAINS(['a', 'b', 'c'], 'b') | CONTAINS(['a', 'b', 'c'], 'd') |
+------------------------------+------------------------------+--------------------------------+--------------------------------+
| 1 | 0 | 1 | 0 |
+------------------------------+------------------------------+--------------------------------+--------------------------------+
array_agg
array_agg() 函数用于将指定列上的多行数据汇聚成 1 个数组值并返回结果。语法如下:
array_agg([DISTINCT] col [ORDER BY col0 [DESC | ASC] [NULLS FIRST | NULLS LAST] ...])
输入参数说明如下:
col聚合数据的目标列。DISTINCT(可选) 用于指定是否对col列进行去重操作。ORDER BY(可选) 用于指定是否对col列进行排序操作。DESC(可选) 用于指定排序方向为降序。ASC(可选) 用于指定排序方向为升序。NULLS FIRST(可选) 用于指定在排序时将NULL值排在最前面。NULLS LAST(可选) 用于指定在排序时将NULL值排在最后面。
返回值为数组类型。
约束如下:
ORDER BY指定的col0不支持数组类型。ORDER BY不支持通过1, 2, ...等数字指定排序列,如果使用数字将会忽略ORDER BY。
示例如下:
SELECT * FROM ss;
+------+------+-----------+-------+--------+
| id | name | subject | score | arr |
+------+------+-----------+-------+--------+
| 1 | Tom | English | 90.5 | [1,2] |
| 1 | Tom | Math | 80.8 | [1,2] |
| 2 | Tom | English | NULL | [1] |
| 2 | Tom | NULL | NULL | NULL |
| 3 | May | NULL | NULL | [2] |
| 3 | Ti | English | 98.3 | [NULL] |
| 4 | NULL | NULL | NULL | NULL |
| NULL | NULL | NULL | NULL | NULL |
| NULL | Ti | 物理Phy | 99 | [3,4] |
+------+------+-----------+-------+--------+
9 rows in set (0.001 sec)
SELECT array_agg(DISTINCT name ORDER BY name ASC), array_agg(name ORDER BY name DESC) FROM ss ORDER BY id;
+--------------------------------------------+-----------------------------------------------------+
| array_agg(distinct name order by name asc) | array_agg(name order by name desc) |
+--------------------------------------------+-----------------------------------------------------+
| [NULL,"May","Ti","Tom"] | ["Tom","Tom","Tom","Tom","Ti","Ti","May",NULL,NULL] |
+--------------------------------------------+-----------------------------------------------------+
1 row in set (0.001 sec)
SELECT array_agg(score ORDER BY score DESC NULLS FIRST), array_agg(score ORDER BY score DESC NULLS LAST) FROM ss ORDER BY id;
+--------------------------------------------------+-------------------------------------------------+
| array_agg(score order by score desc nulls first) | array_agg(score order by score desc nulls last) |
+--------------------------------------------------+-------------------------------------------------+
| [NULL,NULL,NULL,NULL,NULL,99,98.3,90.5,80.8] | [99,98.3,90.5,80.8,NULL,NULL,NULL,NULL,NULL] |
+--------------------------------------------------+-------------------------------------------------+
1 row in set (0.001 sec)
SELECT array_agg(arr ORDER BY id), array_agg(DISTINCT arr) FROM ss;
+---------------------------------------------------+-----------------------------------+
| array_agg(arr order by id) | array_agg(distinct arr) |
+---------------------------------------------------+-----------------------------------+
| [NULL,[3,4],[1,2],[1,2],[1],NULL,[2],[NULL],NULL] | [[1,2],[1],NULL,[2],[NULL],[3,4]] |
+---------------------------------------------------+-----------------------------------+
1 row in set (0.001 sec)
unnest
unnest() 函数用于将数组中的元素展开为多行,并返回一个包含这些元素的关系表。语法如下:
unnest(arr_list) [AS] [table_name[(col_name_list)]]
输入参数说明如下:
arr_list传入一个或多个数组值,之间用逗号分隔。table_name(可选) 用于指定返回的表名,默认值为unnest。AS关键字可省略,功能不变。col_name_list(可选) 用于分别指定返回的每个列的列名,默认值为unnest,之间用逗号分隔。输入的列名数量必须与数组值数量一致。
返回值说明如下:
- 返回一个表,表的行数为输入的数组的最大元素数量,列数为输入的数组个数,数组元素较少的列,将用
NULL补齐空行。 - 对于 n 层嵌套的数组,
unnest只解开第一层(即最外层)数组,即输出的结果为 n-1 层嵌套的数组。 - 第 n 行的内容为每个数组的第 n 个子元素。若
arr_list的元素为基础数据类型,则输出类型为相应元素的类型。若元素为数组类型,则输出类型为数组类型。
约束如下:
unnest()函数只支持放在FROM子句后面。
示例如下:
SELECT * FROM unnest([1,2,3]);
+--------+
| unnest |
+--------+
| 1 |
| 2 |
| 3 |
+--------+
3 rows in set (0.001 sec)
SELECT * FROM unnest([1,2,NULL,3], ['11',NULL,'22']);
+--------+--------+
| unnest | unnest |
+--------+--------+
| 1 | 11 |
| 2 | NULL |
| NULL | 22 |
| 3 | NULL |
+--------+--------+
4 rows in set (0.001 sec)
SELECT t.* FROM unnest([[1,2],[3],NULL,[4,5,6]]) AS t;
+---------+
| unnest |
+---------+
| [1,2] |
| [3] |
| NULL |
| [4,5,6] |
+---------+
4 rows in set (0.001 sec)
SELECT t.* FROM unnest([[1,2],[3],NULL,[4,5,6]], ['hi','hello']) AS t(c1,c2);
+---------+-------+
| c1 | c2 |
+---------+-------+
| [1,2] | hi |
| [3] | hello |
| NULL | NULL |
| [4,5,6] | NULL |
+---------+-------+
4 rows in set (0.001 sec)
SELECT * FROM unnest([1,2,3]) t1(c1), unnest(['11','22']) AS t2(c2);
+------+------+
| c1 | c2 |
+------+------+
| 1 | 11 |
| 1 | 22 |
| 2 | 11 |
| 2 | 22 |
| 3 | 11 |
| 3 | 22 |
+------+------+
6 rows in set (0.001 sec)
array_prepend
array_prepend() 函数用于在数组的开头添加一个元素,并返回一个新的数组。语法如下:
array_prepend(array, element)
输入参数说明如下:
array传入一个数组值。element传入新增的目标元素,需与array参数的数组元素类型一致。
返回值为数组类型。
示例如下:
SELECT array_prepend([1,2,3], 2);
+--------------------------------+
| array_prepend([1,2,3], 2) |
+--------------------------------+
| [2,1,2,3] |
+--------------------------------+
1 row in set (0.001 sec)
SELECT array_prepend([1,2,3], NULL);
+------------------------------+
| array_prepend([1,2,3], NULL) |
+------------------------------+
| [NULL,1,2,3] |
+------------------------------+
1 row in set (0.001 sec)
SELECT array_prepend(["1", "2", "a"], "OceanBase");
+---------------------------------------------+
| array_prepend(["1", "2", "a"], "OceanBase") |
+---------------------------------------------+
| ["OceanBase","1","2","a"] |
+---------------------------------------------+
1 row in set (0.001 sec)
array_concat
array_concat() 函数用于将多个数组合并,并返回一个新的数组。语法如下:
array_concat(array_list)
输入参数说明如下:
array_list传入一个或多个数组值。
返回值为数组类型。
约束如下:
- 支持嵌套数组合并,但要求每个数组的嵌套层数相同,返回结果为第一层(即最外层)元素的合并结果。
示例如下:
SELECT array_concat([1,2,3], [4,5,6]);
+--------------------------------+
| array_concat([1,2,3], [4,5,6]) |
+--------------------------------+
| [1,2,3,4,5,6] |
+--------------------------------+
1 row in set (0.001 sec)
SELECT array_concat([1,2,3], [-4], [5.5,6]);
+--------------------------------------+
| array_concat([1,2,3], [-4], [5.5,6]) |
+--------------------------------------+
| [1,2,3,-4,5.5,6] |
+--------------------------------------+
1 row in set (0.001 sec)
SELECT array_concat([[1,2,3]],[[11],[22,44]]);
+----------------------------------------+
| array_concat([[1,2,3]],[[11],[22,44]]) |
+----------------------------------------+
| [[1,2,3],[11],[22,44]] |
+----------------------------------------+
1 row in set (0.001 sec)