跳到主要内容
版本:Latest-4.0

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) 返回 trueexpr(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] |
+-------------------------------------+
Rocky the happy otterStarRocks Assistant

AI generated answers are based on docs and other sources. Please test answers in non-production environments.