array_sort
对数组中的元素进行升序排列。
语法
ARRAY_SORT(array)
ARRAY_SORT(array, (x,y)->expr(x,y))
参数说明
array:需要排序的数组。支持的数据类型为 ARRAY。
数组元素可以是以下数据类型:BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、LARGEINT、FLOAT、DOUBLE、VARCHAR、DECIMALV2、DATETIME、DATE、JSON。从 2.5 版本开始,该函数支持 JSON 类型的数组元素。
expr(x,y):lambda 比较函数。只能依赖于参数 x 和 y,返回 boolean 或 numeric 类型,结果不能为 NULL,lambda 比较函数需要满足严格弱序关系。
返回值说明
返回的数据类型为 ARRAY。
注意事项
基本排序
- 只支持升序。
null会排在前面。- 如果需要降序排列,可以对排序后的结果,调用
reverse函数。 - 返回的数组元素类型和参数
array中的元素类型一致。
使用 lambda 比较函数排序
-
lambda 比较函数
expr(x,y)需要满足以下要求:- 只能依赖于参数 x 和 y
- 返回 boolean 或 numeric 类型
- 结果不能为 NULL
- 满足严格弱序关系 (strict weak ordering)
-
严格弱序关系的具体要求:
- 非自反性:如果
expr(x, y)返回true,则expr(y, x)必须返回false - 反对称性:如果
expr(x, y)和expr(y, x)都返回false,则 x 和 y 视为相等 - 传递性:如果
expr(x, y)返回true且expr(y, z)返回true,则expr(x, z)也必须返回true - 连通性:对于任意元素 x 和 y,
expr(x, y)或expr(y, x)必须有一个返回true
- 非自反性:如果
示例
下面的示例使用如下数据表进行介 绍。
mysql> select * from test;
+------+--------------+
| c1 | c2 |
+------+--------------+
| 1 | [4,3,null,1] |
| 2 | NULL |
| 3 | [null] |
| 4 | [8,5,1,4] |
+------+--------------+
对 c2 列数组中的元素进行排序(升序)。
mysql> select c1, array_sort(c2) from test;
+------+------------------+
| c1 | array_sort(`c2`) |
+------+------------------+
| 1 | [null,1,3,4] |
| 2 | NULL |
| 3 | [null] |
| 4 | [1,4,5,8] |
+------+------------------+
lambda 比较函数示例
按数组元素的绝对值排序:
mysql> select array_sort([3, -1, -5, 2], (x,y)->abs(x) < abs(y));
+-----------------------------------------------------------------+
| array_sort([3, -1, -5, 2], (x, y) -> abs(x) < abs(y)) |
+-----------------------------------------------------------------+
| [-1, 2, 3, -5] |
+-----------------------------------------------------------------+
按数组元素的字符串长度排序:
mysql> select array_sort(['apple', 'banana', 'cherry'], (x,y)->length(x) < length(y));
+--------------------------------------------------------------------------------------------+
| array_sort(['apple', 'banana', 'cherry'], (x, y) -> length(x) < length(y)) |
+--------------------------------------------------------------------------------------------+
| ['apple', 'banana', 'cherry'] |
+--------------------------------------------------------------------------------------------+
按数组元素的平方和排序:
mysql> select array_sort([1, 2, 3, 4], (x,y)->(x*x + y*y) < 20);
+--------------------------------------------------------------------+
| array_sort([1, 2, 3, 4], (x, y) -> (x * x + y * y) < 20) |
+--------------------------------------------------------------------+
| [1, 2, 3, 4] |
+--------------------------------------------------------------------+
使用复杂比较函数排序:
mysql> select array_sort(['hello', 'world', 'foo', 'bar'], (x,y)->case when length(x) = length(y) then x < y else length(x) < length(y) end);
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| array_sort(['hello', 'world', 'foo', 'bar'], (x, y) -> case when length(x) = length(y) then x < y else length(x) < length(y) end) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ['foo', 'bar', 'hello', 'world'] |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
降序排序示例:
mysql> select reverse(array_sort([4,3,1,2]));
+-----------------------------------+
| reverse(array_sort([4,3,1,2])) |
+-----------------------------------+
| [4,3,2,1] |
+-----------------------------------+
NULL 值排序示例:
mysql> select array_sort([null, 3, 1, null, 2]);
+-------------------------------------+
| array_sort([null, 3, 1, null, 2]) |
+-------------------------------------+
| [null, null, 1, 2, 3] |
+-------------------------------------+